2010-04-07 6 views
0

Bluez에서 기본적으로 여러 장치의 연결을 처리하는 블루투스 기반 서버 프로그램을 만들고 있습니다. 나는 두 개의 스레드를 만들었다. 하나는 원격 장치를 스캔하고 다른 하나는 서비스를 브로드 캐스트하는 장치에 연결합니다. 다시 말하지만, 새로 연결된 각 장치에 대한 스레드 풀에서 별도의 스레드가 추출 된 다음 RFCOMM 채널을 통해 서버와 통신합니다.스레드 풀의 분할 오류

원격 장치와의 연결을 설정 한 후 서버는 원격 Bluetooth 장치에 명령을 보냅니다. 원격 장치가 응답을 보내면 서버는 해당 응답을 읽고 저장합니다.

지금 문제는 장치에서 응답을받을 때마다 프로그램에서 "세그먼트 오류"라는 오류가 발생합니다. 아무도 나에게 이것에 대한 가능한 원인을 말할 수 있습니까? 이 작업을 수행하는 코드 부분이 여기에 나와 있습니다.

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

+0

'분할 오류'는 어디에서 발생합니까? gdb로 디버깅을 했습니까? –

+0

해결책을 얻었습니다 ... 무료 (결과) 부분에 오류가 발생했습니다 ... 스레드 문제가 발생했습니다. – sfactor

답변

3

한 가지 분명한 문제 :

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

당신은 malloc 할당되지 않은 포인터를 해제합니다. 그러면 세분화 오류가 발생할 수 있습니다.

미래에는 gdb를 사용하여 프로그램이 충돌하는 곳을 정확히 찾아보십시오.