【问题标题】:POLLIN event on TCP socket but no data to readTCP 套接字上的 POLLIN 事件,但没有要读取的数据
【发布时间】:2020-07-26 14:58:49
【问题描述】:

我正在使用一个框架,我给它一个套接字,如果有数据要读取(或者如果超时),它将调用我的回调。

尽管没有数据可以从套接字读取,但它一直在以我的 cpu 可以处理的速度呼叫我。

这是我在 strace 的循环中看到的:

[pid 16586] poll([{fd=16, events=POLLIN}, {fd=17, events=POLLIN}], 2, 1000) = 2 ([{fd=16, revents=POLLIN}, {fd=17, revents=POLLIN}])
[pid 16586] recvfrom(16, "", 1024, 0, NULL, NULL) = 0

recvfrom() 不应该返回一些东西还是投票停止提高偶数?

或者我需要做其他事情来清理事件吗?

【问题讨论】:

  • 由于 EOF(远程关闭套接字),没有什么可阅读的也让 poll() 等人返回。
  • 我在wireshark中看到一个来自设备的FIN/ACK,那是远程套接字关闭了吗?
  • 是的,这就是在套接字末端调用close() 的对等方,或者可能是shutdown(fd, SHUT_WR)

标签: c sockets


【解决方案1】:

如 cmets 中所述,由于我连接的设备关闭了套接字(在 wireshark 中被视为来自设备的 FIN/ACK),因此在我端被视为 EOF 条件。

由于 EOF 也会触发 POLLIN 事件,因此该事件会不断触发。

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2014-09-15
    • 2021-01-23
    • 1970-01-01
    • 2017-06-17
    • 2016-08-10
    • 2019-04-02
    • 2016-07-05
    相关资源
    最近更新 更多