gpt4 book ai didi

c++ - select和UDP协议(protocol)结合时收不到数据

转载 作者:行者123 更新时间:2023-11-28 05:08:33 25 4
gpt4 key购买 nike

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)和套接字绑定(bind)都不会导致这个问题。

为了学习 IO 多路复用,我编写了一个名为 IOMultiplexingUtility 的类,它使用户能够将 fd 与相应的可调用对象相结合。设置它们后,它进入无限循环(找到一个可读的 fd - 做一些 Action - 再等一下):

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 永远不会输出),我想不出解决它的方法。任何想法表示赞赏。

最佳答案

似乎是 addFd 中的逻辑缺陷。应该类似于 maxfd = std::max(fd, maxfd),并在构造函数中将 maxfd 初始化为 INT_MIN

关于c++ - select和UDP协议(protocol)结合时收不到数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44026573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com