我正在为项目使用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事件。
答案 0 :(得分:0)
根据WSAPoll()
文档:
WSAEINVAL
传递了无效的参数。如果
fdarray
参数包含一个NULL
指针,则会返回此错误。 如果在请求套接字状态时,在events
参数所指向的任何WSAPOLLFD
结构的WSAPOLLFD
结构的fdarray
成员中指定了无效标志,也会返回此错误。如果fd
参数所指向的任何WSAPOLLFD
结构的fdarray
成员中指定的所有套接字都无效,则也会返回此错误。
根据poll()
文档:
events
类型:
short
一组标志,指示请求的状态类型。 这必须是以下一项或多项。
POLLPRI
可以读取优先数据而不会阻塞。 Microsoft Winsock提供程序不支持此标志。
POLLRDBAND
可以读取优先带(带外)数据而不会阻塞。
POLLRDNORM
普通数据可以无阻碍地读取。
POLLWRNORM
普通数据可以无阻塞地写入。
POLLIN
标志定义为POLLRDNORM
和POLLRDBAND
标志值的组合。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
,您只需免费获得它即可。