Ошибка сегментации в пуле потоков - PullRequest
0 голосов
/ 08 апреля 2010

Я создаю серверную программу на базе Bluetooth в 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" );

}

1 Ответ

3 голосов
/ 08 апреля 2010

Одна очевидная проблема:

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

Вы освобождаете указатель, который не был выделен с помощью malloc. Это может привести к ошибке сегментации.

В будущем попробуйте использовать gdb, чтобы точно определить, где происходит сбой программы.

...