我在两台主机之间有一个全双工连接,它与一个始终在NetworkStream.Read()上侦听的线程交换数据。如何优雅地关闭连接避免:
1-双方read()函数的死锁
2-读取线程的中止()[安全关闭]
我认为用SocketShutdown.Send关闭连接但它是如何工作的?它解锁了另一侧的Read()..文档中的内容并不多。
Thak you
答案 0 :(得分:3)
简单的网络交换看起来像这样:
Server: create socket
Server: listen on socket
Client: create socket
Client: connect to server's address
Server: accept connection, which returns a new socket to use for that connection
Client: receive new socket from result of connect operation
现在已建立连接。将有一些定义的协议用于彼此通信。该协议将决定谁开始。它可以是,但是对于这个例子,让我们假设它是客户端:
Client: send some data
Server: receive the data
Server: send a response
Client: receive the data
Client: shutdown with "send" (but still be prepared to receive)
Server: receive completes with 0 (indicates no more data will be sent by client)
Server: shutdown with "both"
Client: receive completes with 0 (indicates no more data will be sent by server)
Server & Client: close sockets
回答您的具体问题:
How is deadlock avoided?
这里没有死锁的可能性。服务器和客户端通常都使用异步网络API编写。但是,如果定义的协议是简单的请求/响应协议(例如HTTP),那么即使这不是严格要求的。每个端都可以是单线程的,在发送和接收之间根据协议进行交替。
'你如何中止阅读线程?“你没有。如果你确实将整个线程专门用于从套接字读取(这实际上不是很好的设计),那么线程只是在看到一个完整的接收操作时以0字节为长度退出。