2010-04-07 94 views
0

我在Bluez中創建了一個基於藍牙的服務器程序,它基本上處理來自多個設備的連接。我已經構建了兩個線程;一個用於掃描遠程設備,另一個用於連接廣播服務的設備。再次,從線程池中爲每個新連接的設備提取單獨的線程,然後通過RFCOMM通道與服務器進行通信。線程池中的分段錯誤

建立與遠程設備的連接後,服務器將向遠程藍牙設備發送命令。一旦遠程設備回覆,服務器讀取該回復並將其存儲。

現在,問題是每當我從設備收到回覆時程序崩潰,說明「分段錯誤」。任何人都可以告訴我一個可能的原因。這裏給出了代碼的一部分。

void startCommunication(int newSocket) 
{ 


    char buf[MODZ_MAX_DATA_SIZE] = "\0"; 
     char previousData[ MODZ_MAX_DATA_SIZE ] = "\0"; 
     time_t recvTime, prevRecvTime; 
     char dataToBeSent[ 4*MODZ_MAX_DATA_SIZE ] = "\0"; 
     char *result; 

if(sendDataToClient(newSocket, CMD_SEND) == EXT_ERROR) //send acknowledgement first 
    printf("Couldn;t send ack\n"); 
else { printf("Date send woot! woot! %s\n", CMD_SEND); } 

memset(buf, '0', sizeof(buf)); 

while(1){ 
recvTime = time((time_t *)0); 

    if(readDataFromClient(newSocket, buf) == EXT_ERROR){ 
     printf("Read Error\n"); 
     break; 
    } 
    printf("Data received = %s\n", buf); 

    strcpy(previousData, buf); 

    // store the data in a file and send to web 

    // check if the web has any data to send and if there is then send 
    result = "here we update the challenge"; 
    strcpy(dataToBeSent, result); 
    free(result); 
    result = NULL; 

    //strcpy(buf, "We will soon update the database"); 
    if(sendDataToClient(newSocket, dataToBeSent) == EXT_ERROR){ 
     break; 
    } 

    }   
close(newSocket); 

if(result != NULL){ 
    free(result); 

} 

printf("\n****************Device disconnected***************\n"); 

}

+0

您是否嘗試使用'valgrind'? – pajton 2010-04-07 22:24:08

+0

'Segmentation Fault'發生在哪裏?你用gdb調試過嗎? – 2010-04-07 22:29:42

+0

我得到了解決方案...在免費(結果)部分發生故障...有某種線程問題。 – sfactor 2010-04-07 23:10:37

回答

3

一個明顯的問題:

result = "here we update the challenge"; 
strcpy(dataToBeSent, result); 
free(result); 

您正在釋放,這不是與malloc分配的指針。這可能會導致分段錯誤。

未來,嘗試使用gdb來確定程序崩潰的確切位置。