检测TCP客户端断开连接
假设我正在运行一个简单的服务器,并且从客户端连接 accept()
。
Let's say I'm running a simple server and have accept()
ed a connection from a client.
当客户端断开连接时,最好的方式是什么?通常,客户端应该发送关闭命令,但如果手动断开连接或完全失去网络连接怎么办?服务器如何检测或处理这个?
What is the best way to tell when the client has disconnected? Normally, a client is supposed to send a close command, but what if it disconnects manually or loses network connection altogether? How can the server detect or handle this?
select当您使用ioctl *来检查等待被读取的字节数时,它将为零。这是一个标志,套接字已断开。
select (with the read mask set) will return with the handle signalled, but when you use ioctl* to check the number of bytes pending to be read, it will be zero. This is a sign that the socket has been disconnected.
这是一个伟大的讨论,检查客户端已断开连接的各种方法: Stephen Cleary,检测半连接(已删除)连接。
This is a great discussion on the various methods of checking that the client has disconnected: Stephen Cleary, Detection of Half-Open (Dropped) Connections.
*对于Windows使用ioctlsocket。
* for Windows use ioctlsocket.