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

罗马

我在我的项目中使用 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标志被定义为的组合POLLRDNORMPOLLRDBAND标志值。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但是,在以下成员中记录为输出标志reventsWSAPOLLFD

revents

类型: short

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

...

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

...

这与在 *nix 平台上使用POLLHUPin匹配poll()

POLLHUP
挂断(仅在 中返回revents;在忽略events)。请注意,当从管道或流套接字等通道读取时,此事件仅指示对等方关闭了通道的末端。只有在通道中的所有未完成数据都已被消耗后,从通道的后续读取才会返回 0(文件结尾)。

因此,您不需要(在 Windows 上,您不能)明确请求POLLHUP,您只需免费获得它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

POLLHUP vs POLLNVAL,或者什么是POLLHUP?

来自分类Dev

当我将由findViewById()返回的View对象作为参数传递给LinearLayout类的addView()时,为什么会发生错误?

来自分类Dev

当我使用类类型作为参数时,为什么modelstate在剃刀页面中无效?

来自分类Dev

当我添加一个不同的对象作为复制构造函数的参数时,为什么调用复制构造函数?

来自分类Dev

当我添加要返回的列时,为什么 Mysql 查询变慢?

来自分类Dev

recv 调用在 C 轮询中返回 0 vs POLLHUP 事件

来自分类Dev

当我向django添加新语言时,没有错误,但没有显示我的翻译。为什么?

来自分类Dev

当我使用 [[]] 作为我的索引号时,它为什么会返回这个?

来自分类Dev

当我想在Nutiteq上添加新多边形时,为什么会收到InvocationTargetException错误?

来自分类Dev

iOS collectionView Cell 以供重用。为什么单元格的 backgroundColor 很好,当我添加徽章时,出现徽章错误?

来自分类Dev

当我想向图像组件添加自定义样式时,为什么会出现此 ts 错误?

来自分类Dev

当我尝试提交评论而不添加名称和/或正文时,为什么会出现此错误?

来自分类Dev

当我返回false时,为什么textFieldShouldReturn仍在工作?

来自分类Dev

当我进行了看似正确的设置时,无效的BACKEND错误-为什么?

来自分类Dev

为什么当我添加项目时我的集合是空的?

来自分类Dev

为什么当我运行ggttest时出现错误?

来自分类Dev

当我扩展ActionBarActivity时,给出了错误。为什么?

来自分类Dev

当我将 ViewHolder 作为 RecyclerView.Adapter 的类成员时,为什么 getAdapterPosition 返回错误的值

来自分类Dev

为什么当我给它一个参数时函数返回未定义

来自分类Java

为什么当我尝试将Spring Boot应用程序推送到heroku时,它返回“致命错误编译:无效目标版本:11”

来自分类Dev

当我在Rust函数中注释类型时,为什么会出现错误“预期类型参数”?

来自分类Dev

为什么当我使用“ is”而不是“ ==”时np.all返回错误的值?

来自分类Dev

当我在网格/面中实现索引时,为什么返回OpenGl错误?

来自分类Dev

为什么当我添加了一个应该避免这种情况发生的“不存在”参数时,我的查询会插入相同的值?

来自分类Dev

为什么当我调用CreateItemAsync时,Cosmos DB给我一个“输入名称'{'无效”的错误

来自分类Dev

为什么当我引用未用“ @ + id”标记的ID时,为什么没有出现错误?

来自分类Dev

为什么当我使用 node.js 将整数作为参数放入 url 时,我的 RESTful API 卡住了

来自分类Dev

我不知道为什么,但是当我运行以下代码时,它返回9作为质数

来自分类Dev

为什么当我向链接到母版页的页面中的按钮添加点击事件时会出现编译错误

Related 相关文章

  1. 1

    POLLHUP vs POLLNVAL,或者什么是POLLHUP?

  2. 2

    当我将由findViewById()返回的View对象作为参数传递给LinearLayout类的addView()时,为什么会发生错误?

  3. 3

    当我使用类类型作为参数时,为什么modelstate在剃刀页面中无效?

  4. 4

    当我添加一个不同的对象作为复制构造函数的参数时,为什么调用复制构造函数?

  5. 5

    当我添加要返回的列时,为什么 Mysql 查询变慢?

  6. 6

    recv 调用在 C 轮询中返回 0 vs POLLHUP 事件

  7. 7

    当我向django添加新语言时,没有错误,但没有显示我的翻译。为什么?

  8. 8

    当我使用 [[]] 作为我的索引号时,它为什么会返回这个?

  9. 9

    当我想在Nutiteq上添加新多边形时,为什么会收到InvocationTargetException错误?

  10. 10

    iOS collectionView Cell 以供重用。为什么单元格的 backgroundColor 很好,当我添加徽章时,出现徽章错误?

  11. 11

    当我想向图像组件添加自定义样式时,为什么会出现此 ts 错误?

  12. 12

    当我尝试提交评论而不添加名称和/或正文时,为什么会出现此错误?

  13. 13

    当我返回false时,为什么textFieldShouldReturn仍在工作?

  14. 14

    当我进行了看似正确的设置时,无效的BACKEND错误-为什么?

  15. 15

    为什么当我添加项目时我的集合是空的?

  16. 16

    为什么当我运行ggttest时出现错误?

  17. 17

    当我扩展ActionBarActivity时,给出了错误。为什么?

  18. 18

    当我将 ViewHolder 作为 RecyclerView.Adapter 的类成员时,为什么 getAdapterPosition 返回错误的值

  19. 19

    为什么当我给它一个参数时函数返回未定义

  20. 20

    为什么当我尝试将Spring Boot应用程序推送到heroku时,它返回“致命错误编译:无效目标版本:11”

  21. 21

    当我在Rust函数中注释类型时,为什么会出现错误“预期类型参数”?

  22. 22

    为什么当我使用“ is”而不是“ ==”时np.all返回错误的值?

  23. 23

    当我在网格/面中实现索引时,为什么返回OpenGl错误?

  24. 24

    为什么当我添加了一个应该避免这种情况发生的“不存在”参数时,我的查询会插入相同的值?

  25. 25

    为什么当我调用CreateItemAsync时,Cosmos DB给我一个“输入名称'{'无效”的错误

  26. 26

    为什么当我引用未用“ @ + id”标记的ID时,为什么没有出现错误?

  27. 27

    为什么当我使用 node.js 将整数作为参数放入 url 时,我的 RESTful API 卡住了

  28. 28

    我不知道为什么,但是当我运行以下代码时,它返回9作为质数

  29. 29

    为什么当我向链接到母版页的页面中的按钮添加点击事件时会出现编译错误

热门标签

归档