C 为什么当我将POLLHUP添加为事件时,WSAPoll返回错误(无效参数)?
我正在为我的项目使用WSAPoll。我使用跟踪POLLIN和POLLOUT事件。一切都很顺利。当我将POLLHUP添加为事件时,WSAPoll返回错误10022(无效参数) 我不知道出了什么问题,请指导我如何解决:(C 为什么当我将POLLHUP添加为事件时,WSAPoll返回错误(无效参数)?,c,winsock,C,Winsock,我正在为我的项目使用WSAPoll。我使用跟踪POLLIN和POLLOUT事件。一切都很顺利。当我将POLLHUP添加为事件时,WSAPoll返回错误10022(无效参数) 我不知道出了什么问题,请指导我如何解决:( cc_qnt-连接的客户端数量 int ev_cnt = WSAPoll(pfd, cc_qnt + 1, 100); if (ev_cnt > 0) { for (i = 0; i < cc_qnt; i++
cc_qnt
-连接的客户端数量
int ev_cnt = WSAPoll(pfd, cc_qnt + 1, 100);
if (ev_cnt > 0) {
for (i = 0; i < cc_qnt; i++) {
if (pfd[i].revents & POLLHUP) {
// some code
}
if (pfd[i].revents & POLLIN) {
// some code
}
}
if (pfd[cc_qnt].revents & POLLIN) {
我为跟踪POLLHUP而更改的所有内容-将其位添加到pfd[cc_qnt]。事件和WSAPoll开始返回错误。我希望跟踪POLLHUP事件。根据文档:
WSAEINVAL
传递的参数无效。如果fdarray
参数包含NULL
指针,则返回此错误。如果请求套接字状态时fdarray
参数指向的任何结构的事件
成员中指定了无效标志,则也会返回此错误。。如果fdarray
参数指向的任何结构的fd
成员中指定的套接字均无效,则也会返回此错误
根据文件:
事件
类型:short
指示所请求状态类型的一组标志。这必须是以下一项或多项。
POLLPRI
可以在不阻塞的情况下读取优先级数据。Microsoft Winsock提供程序不支持此标志
POLLRDBAND
优先级带(带外)数据可以在无阻塞的情况下读取
pollRDorm
正常数据可以在不阻塞的情况下读取
POLLWRNORM
正常数据可以无阻塞地写入
POLLIN
标志被定义为pollrdorm
和POLLRDBAND
标志值的组合。POLLOUT
标志被定义为与POLLWRNORM
标志值相同
因此,正如您所看到的,POLLHUP
没有被记录为输入到WSAPoll()
的有效标志。实际上,它与winsock2.h
中定义的任何上述标志都不匹配:
/* Event flag definitions for WSAPoll(). */
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004
然而,POLLHUP
作为输出标志记录在wsapolfd
的revents
成员中:
revents
类型:short
从WSAPoll函数调用返回时,指示状态查询结果的一组标志。这可以是以下标志的组合
POLLHUP
已断开或中止面向流的连接 这与on*nix平台中使用的
POLLHUP
相匹配:
POLLHUP
挂起(仅在
revents
中返回;在事件中忽略)。注意
当从管道或溪流等通道读取数据时
套接字,此事件仅表示对等方关闭了其
通道的结尾。从通道的后续读取将
仅在中的所有未完成数据之后返回0(文件结尾)
频道已被占用
因此,您不需要(在Windows上,您不能)明确请求POLLHUP
,您只需免费获得它。cc\u qnt+1
看起来不正确。为什么加1?在cc数组中,我们有连接的客户端套接字的cc\u qnt和一个侦听套接字。+1是最后一个。仅供参考,您真的应该远离WSAPoll()
,(另外:“目前的建议是,如果遇到此问题,不要使用WSAPoll函数,而是使用其他Net API函数。”)。在Windows上使用非阻塞/异步套接字有更好的方法。
/* Event flag definitions for WSAPoll(). */
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004