C#Socket:如何让它保持打开状态?

时间:2016-07-13 04:35:17

标签: c# python sockets

我正在创建一个使用套接字进行通信的简单服务器(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)

如何防止套接字死亡?

1 个答案:

答案 0 :(得分:0)

这是来自MSDN(Remarks on EndAccept):

  

您的回调方法应该调用EndAccept方法。当你的   应用程序调用BeginAccept,系统通常使用单独的   线程执行指定的回调方法并阻塞   EndAccept直到检索到挂起的连接。 EndAccept会   返回一个可用于发送和接收数据的新Socket对象   与远程主机。你不能使用这个返回的Socket接受   来自连接队列的任何其他连接。如果你想要的话   调用BeginAccept方法后要阻止的原始线程,使用   WaitHandle.WaitOne。在。中的ManualResetEvent上调用Set方法   希望原始线程继续时的回调方法   执行。

还有另一个关于stackoverflow check的问题。它会有用吗?