c - ошибка сокета при прохождении через pthread_create - PullRequest
0 голосов
/ 14 октября 2018

У меня есть сервер, который принимает клиентов.Я делаю несколько многопоточности, и когда я создаю поток, я передаю socketfd в качестве аргумента.Принять не удается, потому что sockFd, который требуется, равен нулю.Однако я не могу понять, почему это так.Sockfd действителен для функции take_client и настроен правильно.Я только что включил этот раздел своего кода, потому что я уверен, что проблема здесь.Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

проверьте справочную страницу для возвращаемого значения сокета: «В случае успеха возвращается дескриптор файла для нового сокета. В случае ошибки возвращается -1 и значение errno устанавливается соответствующим образом».Таким образом, нулевое возвращаемое значение является действительным.если только я не понял твою проблему.

0 голосов
/ 14 октября 2018

в вашем коде есть условие гонки, оно может выглядеть "иногда" нормально:

void take_client(int sock) { //sock live on stack here
    pthread_t thread_id;
    pthread_create(&thread_id, NULL, thread_func, (void*)&sock);
    // you pass the stack address of sock to your thread
}

Адрес, который вы передаете, должен оставаться действительным во время работы потока, так что вы можете себе это позволить (этовроде "глобальный" где-то), либо вам нужно выделить новый буфер и передать его потоку.

Иногда вы увидите код, приводящий значение sock к void * ((void *) sock) и приведение обратноуказатель на int в потоке.

Это может сработать, но я думаю, что выделение нового буфера лучше для удобочитаемости и дает четкое представление о том, кто отвечает за этот буфер (с общим «носком»).для обеспечения полной безопасности между потоками потребуется блокировка).

Более того, обычно вам приходится передавать в поток гораздо больше информации, таким образом уже имея буфер, облегчающий развитие вашего кода.

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