【问题标题】:Cannot receive data when select and UDP protocol combinedselect和UDP协议结合时无法接收数据
【发布时间】:2017-10-17 00:25:30
【问题描述】:

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 多路复用,我编写了一个名为 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 从未输出),我无法找到解决它的方法。任何想法都值得赞赏。

【问题讨论】:

    标签: c++ sockets io network-programming udp


    【解决方案1】:

    似乎是addFd 中的一个逻辑缺陷。应该是maxfd = std::max(fd, maxfd) 之类的东西,以及在构造函数中将maxfd 初始化为INT_MIN 之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2013-11-08
      • 2011-05-13
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多