c - 如何在不读取 TCP 连接的情况下检查 TCP 连接是否被对等方正常关闭?

标签 c sockets networking tcp network-protocols

<分区>

我正在使用 Linux。

谁能给我一个例子,说明如何使用 select() 或 poll() 检查 TCP 连接是被对等方通过 FIN 关闭还是被 RST 终止?

poll() 可以通过在 revents 中设置 POLLHUP 或 POLLERR 来检测 RST,但是 select() 没有这样的功能。

在我的测试中,当套接字被 RST 终止时,getsockopt 得到的套接字错误将是 ECONNRESET。这是一种有效的方法吗?

是否需要确定连接是如何关闭的?

谢谢!

最佳答案

如果套接字正常关闭,套接字将被设置为读取。 然后,当你读取时,你将收到 0 数据读取,因为你到达了 EOF。您也可以检查

ioctl(sock, FIONREAD, &n);

判断是否有数据可读。这里有一个例子:c++ how to use select to see if a socket has closed

根据 select man : "将监视 readfds 以查看字符是否可供读取(更准确地说,查看读取是否不会阻塞;特别是,文件描述符也在文件末尾准备就绪)"

如果有挂起的套接字错误,将在readfds或writefds中设置相应的位。然后 read 或 recv 应该返回错误。您也可以使用它来确定套接字中是否存在未决错误:

if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &result, &resultLen) < 0) {
    //getsockopt ERROR
} else if (result == 0) {
    //NO ERROR
} else {
    //SOCKET ERROR
}

关于c - 如何在不读取 TCP 连接的情况下检查 TCP 连接是否被对等方正常关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815832/

相关文章:

c - 我如何修改这个程序,以便它在不修改文件的情况下计算哈希值?

c - 正确解析 C 中的命令行参数

sockets - Nginx 找不到 Unicorn 的 unix 套接字文件(没有这样的文件或目录)

java - 将套接字连接保存在数组中并使用它们 - Java

c - 如何在c中打印数据包的全部数据?

不能对多个文件指定 -c

c - 为什么 C 中没有 "memsize"返回使用 malloc 在堆中分配的内存块的大小?

linux - 在 Linux 上的以太网原始套接字上使用 PACKET_QDISC_BYPASS 选项的示例代码

java - 在我的 java 应用程序中与 paypal 服务器通信时出现 ssl 握手错误

c# - 如何在 C# 中设置服务类型位?