全双工Tcp数据交换c#
本文关键字:交换 数据 Tcp | 更新日期: 2023-09-27 18:30:01
我在两台主机之间有一个全双工连接,这两台主机与一个始终侦听NetworkStream.Read()的线程交换数据。如何优雅地关闭连接避免:
1-两侧读取()函数的死锁
2-读取线程的abort()[安全关闭线程]
我想用SocketShutdown关闭连接。发送,但它是如何工作的?它解锁了另一侧的Read()。。文档中没有太多内容。
Thak you
一个简单的网络交换机看起来像这样:
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字节为长度的接收操作时,它就会退出。