I'm writing my first TCP server using Microsoft's supplied Async examples.
https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
I have everything working from the example. I am extending it as a simple chat program. But I am having trouble following the steps of this program (probably because of its async nature). When a message is received, it echoes back to the client and closes the socket. I do not see where it goes back to re-open the socket.
public static void StartListening() {
// Data buffer for incoming data.
byte[] bytes = new Byte[1024];
// Establish the local endpoint for the socket.
// The DNS name of the computer
// running the listener is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp );
// Bind the socket to the local endpoint and listen for incoming connections.
try {
listener.Bind(localEndPoint);
listener.Listen(100);
while (true) {
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener );
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
private static void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket handler = (Socket) ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
Also, is it not normal to leave the socket open?
When a message is received, it echoes back to the client and closes the socket. I do not see where it goes back to re-open the socket.
That is because it doesn't. The communication is done, the server receives, sends a reply and is done with that connection. It just continues to wait for new connections on the listening socket. You have a while (true). You'll keep waiting for new incoming connections in the accept call. You'll get a new socket for each new client.
Also, is it not normal to leave the socket open
Yes, the listening socket remains open. It is kept open to keep on receiving new connections using accept
A better way to write a echo server using async and await can be found here : Using .Net 4.5 Async Feature for Socket Programming
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With