2011-05-20 56 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