我正在创建一个使用套接字进行通信的简单服务器(C#)和客户端(python)。
服务器创建
var listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
然后绑定,以无限循环监听
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(AcceptCallback, listener);
// Wait until a connection is made before continuing.
AllDone.WaitOne();
}
AcceptCallback
调用BeginReceive,其callbackk读取缓冲区并将消息发送回客户端
python客户端:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
while True:
sock.sendall(data)
blockLen = sock.recv(32) #server sends back a string prefixed with how long the string is
serverReply = sock.recv(blockLen)
如何防止套接字死亡?
答案 0 :(得分:0)
这是来自MSDN(Remarks on EndAccept):
您的回调方法应该调用EndAccept方法。当你的 应用程序调用BeginAccept,系统通常使用单独的 线程执行指定的回调方法并阻塞 EndAccept直到检索到挂起的连接。 EndAccept会 返回一个可用于发送和接收数据的新Socket对象 与远程主机。你不能使用这个返回的Socket接受 来自连接队列的任何其他连接。如果你想要的话 调用BeginAccept方法后要阻止的原始线程,使用 WaitHandle.WaitOne。在。中的ManualResetEvent上调用Set方法 希望原始线程继续时的回调方法 执行。
还有另一个关于stackoverflow check的问题。它会有用吗?