td1336065617 2023-11-21 00:53 采纳率: 0%
浏览 5

post发送一次数据,服务器端多次触发epoll的读事件,如何确定数据传输完成比较好?

我post了 100kb数据
然后我发现 epoll连续触发了三次读
我的recv是在线程池里面进行的非阻塞。
recv如果直接执行 他就接两次 第三次没接就跑了
我加个调试卡一下速度 就连续能接三次
我发现中间有recv没有读到数据 recv也返回-1所以导致后面的一份没接到
我现在加了个map记录有几次需要读 读到数据在减少可行不
有没有比如 epoll触发的读次数 比recv读的次数少的可能(短链接 每次链接只可能接一次数据就断开了的情况下 )
或者我recv改为阻塞,设置超时时间怎么样。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-21 02:04
    关注

    【以下回答由 GPT 生成】

    对于在服务器端使用epoll进行非阻塞读取数据时,如何确定数据传输已经完成的问题,以下是一种解决方案:

    1. 首先,确保您正确地使用了epoll函数来监视文件描述符上的事件。确保您已经正确地设置了感兴趣的事件类型,例如EPOLLIN用于读事件。

    2. 当epoll_wait返回一个或多个事件时,您需要使用循环迭代这些事件,并针对每个事件进行处理。

    3. 对于每个读事件,使用recv函数进行非阻塞读取,可以设置一个较小的缓冲区,例如1024字节。确保您设置了MSG_DONTWAIT标志来进行非阻塞操作。

    4. 接下来,检查recv函数的返回值,它将指示接收到的字节数。具体处理方法如下:

    5. 如果返回值大于0,表示成功接收到数据。您可以将这些接收到的数据追加到您的数据缓冲区中进行进一步处理。
    6. 如果返回值等于0,表示连接已关闭。您可以关闭该连接并清理相关资源。
    7. 如果返回值为-1,表示发生了错误。您可以根据errno变量的值来确定具体的错误类型。一些常见的错误类型包括EAGAIN和EWOULDBLOCK,表示当前没有更多的数据可供接收。

    8. 在循环迭代处理每个读事件之后,您可以检查数据缓冲区中是否已经接收到了您期望的完整数据。

    9. 如果您的数据有一个固定的长度,可以使用缓冲区中接收到的数据的长度进行判断。如果达到了您期望的长度,则表示数据传输已经完成。
    10. 如果您的数据没有固定的长度,您可以定义一些特殊的结束符或标记来表示数据传输的完成。您可以在缓冲区中搜索这些特殊的结束符或标记。

    请注意,以上方案只是一种基本的示例,您可能需要根据您的具体需求进行相应的调整。

    如果您仍然遇到问题或需要更多帮助,请提供更多详细信息以便我们能够更准确地回答您的问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月21日

悬赏问题

  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题