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

时间:2019-04-04 20:27:59

标签: c winsock

我正在为项目使用WSAPoll。我使用了跟踪POLLIN和POLLOUT事件。一切正常。当我将POLLHUP添加为事件时,WSAPoll返回错误10022(无效参数)。

我不知道怎么了,请指导我如何解决:(

import numpy as np doc = open("d.csv") headers = doc.readline() def generateArray(doc): for theData in doc: editDocument = theData.strip().split(",") x = splitDocument[0] y = splitDocument[1] createArray = np.array((x, y)) return createArray print(generateArray(doc)) -连接的客户端数量

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) { 来添加新的套接字(由accept返回),而不是监听套接字。然后我们重新分配大小为+ 1的pfd,复制以前的数据并在cc数组的末尾添加侦听套接字。

pfd[cc_qnt]

我为跟踪POLLHUP所做的所有更改-将它添加到pfd [cc_qnt]中。事件和WSAPoll开始返回错误。我希望跟踪POLLHUP事件。

1 个答案:

答案 0 :(得分:0)

根据WSAPoll()文档:

  

WSAEINVAL

     

传递了无效的参数。如果fdarray参数包含一个NULL指针,则会返回此错误。 如果在请求套接字状态时,在events参数所指向的任何WSAPOLLFD结构的WSAPOLLFD结构的fdarray成员中指定了无效标志,也会返回此错误。如果fd参数所指向的任何WSAPOLLFD结构的fdarray成员中指定的所有套接字都无效,则也会返回此错误。

根据poll()文档:

  

events

     

类型:short

     

一组标志,指示请求的状态类型。 这必须是以下一项或多项。

     

POLLPRI
    可以读取优先数据而不会阻塞。 Microsoft Winsock提供程序不支持此标志。

     

POLLRDBAND
  可以读取优先带(带外)数据而不会阻塞。

     

POLLRDNORM
  普通数据可以无阻碍地读取。

     

POLLWRNORM
  普通数据可以无阻塞地写入。

     

POLLIN标志定义为POLLRDNORMPOLLRDBAND标志值的组合。 POLLOUT标志的定义与POLLWRNORM标志的值相同。

因此,如您所见,POLLHUP没有被记录为对WSAPoll() input 输入有效的标志。实际上,它与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的{​​{1}}成员中,

revents被记录为 output 标志:

  

WSAPOLLFD

     

类型:revents

     

一组标志,这些标志指示从WSAPoll函数调用返回后的状态查询结果。这可以是以下标志的组合。

     

...

     

short
  面向流的连接已断开或中止。

     

...

这与* nix平台上{{3}}中POLLHUP的使用相匹配:

  

POLLHUP
  挂断电话(仅在POLLHUP中返回;在revents 中忽略)。注意   从管道或溪流等通道读取时   套接字,此事件仅表明对等方已关闭其   频道的结尾。随后从该通道读取   仅在所有未完成的数据之后,才返回0(文件末尾)   频道已被占用。

因此,您不需要(在Windows上也不能)显式请求events,您只需免费获得它即可。