2017-05-17 6 views
0

Der ursprüngliche Code für den UDP-Client kombiniert wird, wie unten dargestellt:Kann keine Daten empfangen, wenn das Auswahl und UDP-Protokoll

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; 
    } 

Es funktioniert gut, so dass weder Server (Recvfrom und sendto verwendet) noch Buchse Bindung Ursachen dieses Problem .

Um E/A-Multiplex zu lernen, schreibe ich eine Klasse mit dem Namen IOMultiplexingUtility, die Benutzer kombinieren eine fd mit entsprechenden Callable-Objekt. Nach der Einstellung ändern sie in eine Endlosschleife Schritt (eine lesbare fd finden - eine Aktion tun - warten wieder):

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; 
}; 

Modified UDP-Client-Code wie folgt aus:

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(); 

Bug aufgetreten (I Eingabetext , Server empfängt und sendet erfolgreich, aber cbuf wird nie ausgegeben) und ich kann keinen Weg finden, es zu lösen. Jede Idee wird geschätzt.

Antwort

1

Scheint wie ein logischer Fehler in addFd. Sollte etwas wie maxfd = std::max(fd, maxfd) sein, sowie maxfd zu etwas wie INT_MIN im Konstruktor initialisieren.

Verwandte Themen