轮询recvfrom(),sendto()

时间:2018-08-23 13:02:54

标签: c++ linux multithreading udp polling

我将两个分离的线程重新制成服务器中的poll()循环:用于接收和发送数据。 一切正常,直到将客户端的发送频率设置为16 ms(<〜200 ms)。在这种状态下,总是有一个线程在比赛中获胜,并仅以大约1美元的ping响应一个客户端。我需要做的是使用两个(或一个)UDP套接字在poll()中发送和接收数据?

服务器代码的一部分:

struct pollfd pollStruct[2];
// int timeout_sec = 1;

pollStruct[0].fd = getReceiver()->getSocketDesc();
pollStruct[0].events = POLLIN;
pollStruct[0].revents = 0;
pollStruct[1].fd = getDispatcher()->getSocketDesc();
pollStruct[1].events = POLLOUT;
pollStruct[1].revents = 0;

while(true) {
    if (poll(pollStruct, 2, 0 /* (-1 / timeout) */) > 0) {
        if (pollStruct[0].revents & POLLIN) {
            recvfrom(getReceiver()->getSocketDesc(), buffer, getBufferLength(), 0, (struct sockaddr *) &currentClient, getReceiver()->getLength());
            // add message to client's own thread-safe buffer
        }

        if (pollStruct[1].revents & POLLOUT) {
            // get message from thread-safe general buffer after processing
            // dequeue one
            if (!getBuffer().isEmpty()) {
                auto message = getBuffer().dequeue();
                if (message != nullptr) {
                    sendto(getDispatcher()->getSocketDesc(), "hi", 2, 0, message->_addr, *getDispatcher()->getLength());
                }
            }
        }

    }
}

0 个答案:

没有答案