Обработка пакетов, полученных от нескольких клиентов, в несколько потоков в c - PullRequest
0 голосов
/ 28 мая 2019

когда несколько клиентов отправляют пакеты на сервер, как я могу написать код для получения их в соответствующих дочерних потоках вместо получения их в основном процессе

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

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

мой код код сервера

//created udp socket

// binded

while(1)
{
    // to receive new connections 
    n=recvfrom(sock,buffer,512,0,(struct sockaddr*)&from,&length);  

    // if some client sent request i will assign new thread to serve it
    pthread_create(&thread_id[str_cnt], NULL, serve,(void*)(&cli[str_cnt])); 
}

function serve(args)
{

    while(1)
    {   
        // sendind data to that client
        sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &clientaddr,clientlen);

        //now wating for ack from the client
        sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &clientaddr,clientlen);
    }
}

}

1 Ответ

0 голосов
/ 28 мая 2019

Вы не можете одновременно читать несколько потоков из одного и того же сокета.

Вместо этого вы должны либо:

  1. иметьвыделенный поток, который получает все входящие пакеты, просматривает исходный IP / порт и, при необходимости, направляет данные в соответствующий поток обработки.

  2. присваивает каждому потоку обработки свой собственный сокет, которыйbind() 'отправил на тот же локальный IP / порт и connect()' отправил на конкретный IP / порт источника, который ему интересен, тогда каждый поток может независимо вызывать recvfrom() и будет возвращать только те пакеты, которые соответствуют источнику, которыйпоток ожидает.

Я взял это от Реми Лебо на этот вопрос .

UDP неу вас не будет понятия об отдельных соединениях, если вы не используете разные порты и не обрабатываете их сами, поэтому они создали TCP (а также для более надежного и упорядоченного взаимодействия). Вы уже эмулируете надежную связь с помощью ACK,так что единственные издержки - это порядок связи (и контрольные суммы, если они вам тоже не нравятся), поэтому вам лучше использовать TCP.

...