You can signal “end of data” by closing only your half of a duplex TCP connection . This is done using Socket.Disconnect
.
See how this works with this example that I saved, similar to yours. The client sends the data, and then calls Disconnect
; this allows ReadToEnd
return, while maintaining half the server’s opening. Then the server sends a response, and also disconnects, after which both parties can Close
to close their connection to tear it off.
static void Main(string[] args) { Action clientCode = () => { var buffer = new byte[100]; var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(IPAddress.Loopback, 6690); clientSocket.Send(buffer); clientSocket.Disconnect(false); Console.WriteLine("Client: message sent and socket disconnected."); while (true) { var bytesRead = clientSocket.Receive(buffer); if (bytesRead == 0) { break; } Console.WriteLine("Client: read " + bytesRead + " bytes."); } clientSocket.Dispose(); }; var server = new TcpListener(IPAddress.Loopback, 6690); var thread = new Thread(new ThreadStart(clientCode)); server.Start(); thread.Start(); var client = server.AcceptTcpClient(); using(NetworkStream stream = client.GetStream()) { using(StreamReader streamReader = new StreamReader(stream)) { var data = streamReader.ReadToEnd(); Console.WriteLine("Server: read " + data.Length + " bytes.");
source share