我在我的项目中使用 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) {
在这一部分,我们准备好接受新的连接。我们编辑pfd[cc_qnt]
添加新套接字(由接受返回)而不是监听套接字。然后我们重新分配大小为 + 1 的 pfd,复制以前的数据并在 cc 数组的末尾添加监听套接字。
int addrlen = sizeof(addr);
cc[cc_qnt].s = accept(ls, (struct sockaddr*) &addr, &addrlen);
cc[cc_qnt].ip = ntohl(addr.sin_addr.s_addr);
cc[cc_qnt].sent_put = 0;
cc[cc_qnt].c_cl_cn = 0;
pfd[cc_qnt].fd = cc[i].s;
pfd[cc_qnt].events = POLLIN | POLLOUT | POLLHUP;
cc_qnt++;
pfd = init_pfd(pfd, ls, cc_qnt);
}
}
else if (ev_cnt < 0) {
exit(printf("\nprocess_events: WSAPoll, ev_cnt = %d, WSAGetLastError: %d \n", ev_cnt, WSAGetLastError()));
}
我为跟踪 POLLHUP 而更改的所有内容 - 将其添加到 pfd[cc_qnt].events 和 WSAPoll 开始返回错误。我希望跟踪 POLLHUP 事件。
根据WSAPoll()
文档:
WSAEINVAL
传递了无效参数。如果
fdarray
参数包含NULL
指针,则返回此错误。如果在请求套接字状态时在参数指向events
的任何WSAPOLLFD
结构的成员中指定了无效标志,也会返回此错误fdarray
。如果参数指向fd
的任何WSAPOLLFD
结构的成员中指定的套接字fdarray
均无效,则也会返回此错误。
并根据WSAPOLLFD
文档:
events
类型:
short
一组指示正在请求的状态类型的标志。这必须是以下一项或多项。
POLLPRI
可以无阻塞地读取优先数据。Microsoft Winsock 提供程序不支持此标志。
POLLRDBAND
可以无阻塞地读取优先带(带外)数据。
POLLRDNORM
可以无阻塞地读取正常数据。
POLLWRNORM
可以无阻塞地写入普通数据。该
POLLIN
标志被定义为的组合POLLRDNORM
和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
但是,在以下成员中记录为输出标志:revents
WSAPOLLFD
revents
类型:
short
一组标志,在从 WSAPoll 函数调用返回时指示状态查询的结果。这可以是以下标志的组合。
...
POLLHUP
面向流的连接已断开或中止。...
这与在 *nix 平台上使用POLLHUP
in匹配poll()
:
POLLHUP
挂断(仅在 中返回revents
;在中忽略events
)。请注意,当从管道或流套接字等通道读取时,此事件仅指示对等方关闭了通道的末端。只有在通道中的所有未完成数据都已被消耗后,从通道的后续读取才会返回 0(文件结尾)。
因此,您不需要(在 Windows 上,您不能)明确请求POLLHUP
,您只需免费获得它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句