Передача сокета в поток вместо fd? - PullRequest
0 голосов
/ 12 февраля 2019

Я использую эту функцию, чтобы принять нового клиента и передать его в поток

struct sockaddr_in client;
while(1) {
    len = sizeof(client);
    fd = accept(sock, (struct sockaddr*)&client, &len);
    if(fd>0) {
        CreateThread(NULL, 0, process_thread, (LPVOID)fd, 0, &thread);
        // pthread_create( &thread , NULL , process_thread , (int)fd);
    }
}

и обработать его как

DWORD WINAPI process_thread(LPVOID lpParam) {
//void process_thread(int sock) {
    SOCKET fd = (SOCKET)lpParam;
    //int fd = sock;
    ....  
}

Могу ли я также создать новый поток с помощью client структура (sockaddr_in) и выберите fd внутри функции обработчика, как

CreateThread(NULL, 0, process_thread, (SOCKET)client, 0, &thread);

и как?И если да, то как принять после создания темы?Это возможно?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Что вам нужно сделать, это создать новую структуру для хранения обоих ваших значений:

struct process_thread_info
{
    struct sockaddr_in client;
    SOCKET fd;
};

, а затем вы можете передать эту структуру:

// We must use malloc to create a new struct for every client.
// We can't just declare one here and then use its address,
// because it might go out of scope before the process_thread receives the info.
struct process_thread_info *threadinfo = malloc(sizeof(struct process_thread_info));
threadinfo->fd = fd;
threadinfo->client = client;

CreateThread(NULL, 0, process_thread, threadinfo, 0, &thread);
// pthread_create( &thread , NULL , process_thread , threadinfo);

Как и при любом другом использованииmalloc, не забудьте иметь нить free структуру, когда она закончит его использовать.

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