2017-05-17 37 views
0

被如下所示的UDP客户端的原始代码:无法接收数据时选择和UDP协议组合

while (getline(cin, buf)) { 
     // c.getConnd() return connected fd 
     write(c.getConnfd(), buf.c_str(), buf.size()); 
     memset(cbuf, 0, sizeof(cbuf)); 
     read(c.getConnfd(), cbuf, 1024); 
     LOG(DEBUG) << "read message: " << cbuf; 
    } 

它工作正常,所以既不服务器(使用recvfrom的和SENDTO),也不插座结合引起该问题。

要学习IO Multiplex,我编写了一个名为IOMultiplexingUtility的类,它使用户可以将fd与各自的可调用对象组合起来。设置这些后,它步入一个无限循环(找一个可读的fd - 做一些动作 - 再次等待):

class IOMultiplexingUtility { 
public: 
    IOMultiplexingUtility() { 
     FD_ZERO(&socketSet); 
    } 

    void addFd(int fd, std::function<void(int)> action) { 
     maxfd = fd + 1; 
     FD_SET(fd, &socketSet); 
     fdVec[fd] = action; 
    } 

    void start() { 
     auto readySet = socketSet; 
     select(maxfd + 1, &readySet, NULL, NULL, NULL); 
     for (auto &pair: fdVec) 
      if (FD_ISSET(pair.first, &readySet)) { 
       if (pair.second != nullptr)pair.second(pair.first); 
       else if (defaultAction) defaultAction(pair.first); 
      } 
    } 

private: 
    fd_set socketSet; 
    int maxfd; 
    std::unordered_map<int, std::function<void(int)>> fdVec; 
}; 

修改UDP客户端代码是这样的:发生

io.addFd(c.getConnfd(), [&c](int)mutable -> void { 
    char cbuf[1024]; 
    memset(cbuf, 0, sizeof(cbuf)); 
    read(c.getConnfd(), cbuf, 1024); 
    cout << cbuf << endl; 
}); 

io.addFd(fileno(stdin), [&c](int)mutable -> void { 
    string buf; 
    getline(cin, buf); 
    write(c.getConnfd(), buf.c_str(), buf.size()); 
}); 

while (true) io.start(); 

错误(我输入文本,服务器接收和发送成功,但cbuf永远不会被输出),我无法找出一种方法来解决它。任何想法是赞赏。

回答

1

似乎是addFd中的逻辑瑕疵。应该是类似maxfd = std::max(fd, maxfd),以及在构造函数中将初始化为maxfd