C 为什么当我将POLLHUP添加为事件时,WSAPoll返回错误(无效参数)?

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++

我正在为我的项目使用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++)  {   

                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