poll() 似乎看不到 UDP 套接字上的事件
poll() doesn't seem to see events on an UDP socket
我正在尝试使用poll()
编写一个web程序。我在struct pollfd
数组中创建一个UDP
,然后轮询它。但是,无论我向它发送多少次消息,poll()
每次都返回0。当我只调用recvfrom
时,它工作得很好。这是我的代码:
创建和绑定套接字:
struct pollfd[2] fds;
// ...
fds[0].fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fds[0].fd < 0)
syserr("socket");
listen_address = { 0 };
listen_address.sin_family = AF_INET;
listen_address.sin_addr.s_addr = htonl(INADDR_ANY);
listen_address.sin_port = htons(m_port);
if (bind(
fds[0].fd,
(struct sockaddr*) &listen_address,
(socklen_t) sizeof(listen_address)
) < 0)
syserr("bind");
现在这个工作:
for (;;) {
memset(buffer, 0, BUF_SIZE + 1);
rval = recvfrom(
fds[0].fd,
buffer,
BUF_SIZE,
0,
(struct sockaddr *) &respond_address,
&rcva_len
);
std::cout << buffer << std::endl;
}
但这不是
finished = false;
do {
fds[0].revents = fds[1].revents = 0;
ret = poll(fds, 2, 0);
if (ret < 0) {
perror("poll");
} else if (ret == 0) {
// the loop always enters here
} else {
// the loop never enters here,
// even though I send messages to the socket
}
} while (!finished);
为了测试,我使用了一个类似的命令
echo -n “foo” | nc -4u -w1 <host> <udp port>
我很想了解
使用poll()
的方式存在两个关键问题:
-
必须为每个文件描述符设置
revents
字段,以指示您感兴趣的事件,例如POLLIN
和/或POLLOUT
。您的代码无法将revents
设置为任何值。 -
poll()
的第三个参数是超时设置。您正在将其设置为0。这意味着"检查文件描述符是否发生了任何请求的events
,但在任何情况下都会立即返回,如果没有文件描述符包含请求的事件,则返回0"。
这就是你所看到的行为。
我不告诉您需要将第三个参数设置为什么,而是让您参阅poll()
的手册页,以便等待任何文件描述符的事件发生。阅读手册页很好。他们解释一切。
结论:
-
正确初始化每个文件描述符的
revents
参数。 -
将正确的参数传递给
poll()
,如其手册页面所述。如果您希望poll()
无限期等待,直到任何传递的文件描述符的请求事件发生,则有一个特定的值来执行此操作。查一下。 -
poll()
返回后,检查每个文件描述符的events
参数以确定文件描述符的状态。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- Winsock2 select():同一个套接字上可能有多个事件吗?
- epoll_wait() 是否报告所有关闭的套接字事件
- c++套接字客户端在输出流关闭的情况下不断从Java服务器事件中接收一些内容
- WSAEventSelect,一个事件,多个套接字
- 如果客户端的互联网断开连接,客户端套接字不会关闭。如何在服务器中检测此事件?
- epoll_wait() 可以只用 1 个套接字和 1 个事件> 1 - EPOLLIN?
- 如何同时处理用户交互和套接字事件
- 基于套接字的事件循环
- poll() 似乎看不到 UDP 套接字上的事件
- C 套接字/轮询错误地返回 POLLOUT 事件