2011-05-20 63 views
1

我有模拟器上运行良好的代码,但只要我在设备上尝试它的程序崩溃。C iPhone设备上的套接字崩溃。 EXC_BAD_ACCESS

它初始化套接字时发生..这里是我的代码和什么运行/调试吐出来。 (server_name是在服务器运行我的机器的主机名)

错误:在.M

Program received signal: “EXC_BAD_ACCESS”. 
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.3 (8J3)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found). 

在.H

int connectionSocket; 
struct hostent *server; 
struct sockaddr_in server_addr; 

- (void)viewDidLoad { 
[super viewDidLoad]; 

TRANSFER_COMPLETED = false; 
TIME_COMPLETED = false; 

//[UIApplication sharedApplication].idleTimerDisabled = YES; //Disable app sleep (check this out) 


//Build connection to Server 
portNumber = PORT_NUM; 
connectionSocket = socket(PF_INET, SOCK_STREAM, 0); 
server = gethostbyname(SERVER_NAME); 
server_addr.sin_family = AF_INET;  
server_addr.sin_port = htons(portNumber); 
//server_addr.sin_addr = *((struct in_addr *)server->h_addr); 
memcpy (&(server_addr.sin_addr), server->h_addr, server->h_length); 

if (connect(connectionSocket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) 
{ 
    perror("Connect"); 
    exit(1); 
} 

//Setup Battery monitoring and Device characteristics 
myDevice = [UIDevice currentDevice]; 
myDevice.batteryMonitoringEnabled = YES; 
NSString* sysName = myDevice.systemName; 
NSString* sysVersion = myDevice.systemVersion; 

//Name the file for this device 

NSString* myString = [NSString stringWithFormat:@"systemName:%@ systemVersion:%@ \n", sysName, sysVersion]; 

const char* deviceInfo = malloc(128); 
char* deviceSettings = malloc(256); 

deviceInfo = [myString UTF8String]; 

//Get the battery State 
int intBatteryState = myDevice.batteryState; 
char* batteryState = malloc(24); 
switch(intBatteryState){ 
    case 0: 
     batteryState = "Unknown"; 
     break; 
    case 1: 
     batteryState = "Unplugged"; 
     break; 
    case 2: 
     batteryState = "Charging"; 
     break; 
    case 3: 
     batteryState = "plugged and full"; 
     break; 
    default: 
     batteryState = "Error"; 
     break; 
} 

sprintf(deviceSettings, "iOS Test *** APPLICATION_BUFFER_SIZE(B): %i, SLEEP_TIME(microseconds) per app buffer size: %i, TOTAL_BYTES_EXPECTED per download: %i, TOTAL_DOWNLOADS: %i, TEST_TIME(s): %i, Battery State:%s \n", (int) round(APPLICAION_BUFFER_SIZE), SLEEP_TIME, TOTAL_BYTES_EXPECTED, TOTAL_DOWNLOADS, TEST_TIME, batteryState); 

send(connectionSocket, DEVICE_NAME, strlen(DEVICE_NAME), 0); 
sleep(1); 
send(connectionSocket, deviceSettings, strlen(deviceSettings), 0); 
send(connectionSocket, deviceInfo, strlen(deviceInfo), 0); 

free(deviceSettings); 
//free(deviceInfo);//Says it is being freed without being allocated but I allocated it with malloc... 
//free(batteryState); 

// [NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:nil]; 

// [ NSThread detachNewThreadSelector:@selector(keepRunning)toTarget:self withObject:nil]; // [NSThread detachNewThreadSelector:@selector(busyLoop)toTarget:self withObject:nil]; //

// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelDidChange) name:UIDeviceBatteryLevelDidChangeNotification object:nil]; 

// [[NSNotificationCenter defaultCenter]的addObserver:自选择器:@selector(batteryStateDidChange)名称:UIDeviceBatteryStateDidChangeNotification对象:无];

+0

只是一个建议:'server = gethostbyname(SERVER_NAME);'已弃用。它很好看[getaddrinfo()](http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#getaddrinfoman) – Mayank 2011-05-20 03:30:56

+0

什么是输出的服务器= gethostbyname(SERVER_NAME);' – Mayank 2011-05-20 03:39:41

回答

1

使用

memcpy (&(serv_addr.sin_addr), server->h_addr, server->h_length); 

代替

server_addr.sin_addr = *((struct in_addr *)server->h_addr); 

或者您也可以使用server_addr.sin_addr.s_addr = inet_addr(IP);

这只是为了避免撞车尝试。但我不知道为什么server_addr.sin_addr = *((struct in_addr *)server->h_addr);会崩溃。

编辑: 试试这个:

portNumber = PORT_NUM; 
connectionSocket = socket(AF_INET, SOCK_STREAM, 0); 
server_addr.sin_family = AF_INET;  
server_addr.sin_port = htons(portNumber); 
server_addr.sin_addr.saddr = htonl(INADDR_ANY); 

这并不需要server = gethostbyname(SERVER_NAME);,我注意到是

一件事:

connectionSocket = socket(**PF_INET**, SOCK_STREAM, 0); 
//server = gethostbyname(SERVER_NAME); 
server_addr.sin_family = **AF_INET**; 

这是正常的。我的意思是两个陈述中的不同协议?

+0

@Mayank谢谢你的建议,不幸的是它似乎没有改变任何东西。 – Michael 2011-05-20 03:19:30

+0

@Michael:我知道这两个语句都是类似的......你能否添加一些更多的代码......就像你在进入之前检查NULL一样。 – Mayank 2011-05-20 03:24:43

+0

我曾经犯过类似的错误。在那种情况下,我正在检查'if(NULL == server)'但服务器未初始化,未设置为NULL。我希望这样的事情已经被处理 – Mayank 2011-05-20 03:27:01