создать обработчик соединения с pthreads в c (Linux / Windows) - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь написать программу, которая должна работать на Windows и Linux.Он использует сервер, который обрабатывает данные, поэтому я настраивал его, используя инструкции #def, пока не пришел к многопоточности.Я немного искал и думаю, что pthread должен нормально работать из коробки (windows & linux).

У меня есть функция эха, которая получает и отправляет данные из и в сокет.

static void echo(int client_socket) { /* or SOCKET client_socket */
    char echo_buffer[RCVBUFSIZE];
    int recv_size;
    recv_size = recv(client_socket, echo_buffer, RCVBUFSIZE,0);
    echo_buffer[recv_size] = '\0';
}

для обработки клиента у меня есть бесконечный цикл, который принимает () соединение и передает его функции эха.

/* sock = int | SOCKET */
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
memset( &server, 0, sizeof (server));
bind(sock,(struct sockaddr*)&server, sizeof( server));
listen(sock, 5);

for (;;) {
    len = sizeof(client);
    fd = accept(sock, (struct sockaddr*)&client, &len);
    echo( fd );

, поэтому я попытался заменить функцию эха на pthread

    len = sizeof(client);
    fd = accept(sock, (struct sockaddr*)&client, &len);
    pthread_t thread_id;
    pthread_create( &thread_id , NULL , echo, (void*) &client);

Я также пытался изменить 4-й параметр pthread_create, чтобы передать его напрямую, но не могу понять, как использовать их в моем случае.

1 Ответ

0 голосов
/ 08 сентября 2018

Вам нужна функция, которую pthread_create может принять, и вам нужно правильно ее вызвать. Вот один из способов:

void* wrapper (void* fd)
{
    echo((int) fd);
    return NULL;
}

Теперь вы можете сделать это:

pthread_create( &thread_id , NULL , wrapper, (void*) fd);

Вы должны исправить свою функцию echo, чтобы правильно обрабатывать возврат из read нулевого или отрицательного значения.

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