【发布时间】:2015-08-08 23:48:03
【问题描述】:
我正在使用 Microsoft 提供的 Async 示例编写我的第一个 TCP 服务器。
https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
我已经从这个例子中得到了一切。我将它扩展为一个简单的聊天程序。但是我无法按照这个程序的步骤进行操作(可能是因为它的异步性质)。当收到消息时,它会回显给客户端并关闭套接字。我看不到它会回到哪里重新打开套接字。
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());
}
}
另外,让套接字保持打开状态是不正常的吗?
【问题讨论】:
-
你知道怎么写阻塞回显服务器吗?如果你这样做了,那么你应该阅读反应器和前摄器模式。
-
以下行:listener.Listen(100).
-
这是不良 MS 样本之一。这里的异步 IO 并不是真正的异步,因为它等待完成。毫无意义。
-
@usr 这对他们有很大的误导......