2017-05-17 35 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