开发者

TcpClient.BeginRead/TcpClient.EndRead doesn't throw exception when internet disconnected

开发者 https://www.devze.com 2023-02-07 19:07 出处:网络
I\'m using TcpListener to accept & read from TcpClient. The problem is that when reading from a TcpClient, TcpClient.Begi开发者_StackOverflownRead / TcpClient.EndRead doesn\'t throw exception when

I'm using TcpListener to accept & read from TcpClient. The problem is that when reading from a TcpClient, TcpClient.Begi开发者_StackOverflownRead / TcpClient.EndRead doesn't throw exception when the internet is disconnected. It throws exception only if client's process is ended or connection is closed by server or client.


The system generally has no chance to know that connection is broken. The only reliable way to know this is to attempt to send something. When you do this, the packet is sent, then lost or bounced and your system knows that connection is no longer available, and reports the problem back to you by error code or exception (depending on environment). Reading is usually not enough cause reading only checks the state of input buffer, and doesn't send the packet to the remote side.


As far as I know, low level sockets doesn't notify you in such cases. You should provide your own time out implementation or ping the server periodically.


If you want to know about when the network status changes you can subscribe to the System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged event. This is not specific to the internet, just the local network.

EDIT

Sorry, I misunderstood. The concept of "connected" really doesn't exist the more you think about it. This post does a great job of going into more details about that. There is a Connected property on the TcpClient but MSDN says (emphasis mine):

Because the Connected property only reflects the state of the connection as of the most recent operation, you should attempt to send or receive a message to determine the current state. After the message send fails, this property no longer returns true. Note that this behavior is by design. You cannot reliably test the state of the connection because, in the time between the test and a send/receive, the connection could have been lost. Your code should assume the socket is connected, and gracefully handle failed transmissions.

Basically the only way to check for a client connection it to try to send data. If it goes through, you're connected. If it fails, you're not.


I don't think you'd want BeginRead and EndRead throwing exceptions as these should be use in multi threaded scenarios.

You probably need to implement some other mechanism to respond to the dropping of a connection.

0

精彩评论

暂无评论...
验证码 换一张
取 消