gpt4 book ai didi

c# - 在 EndAccept() 之前或之后开始接受新连接

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:40 24 4
gpt4 key购买 nike

我有一个问题,在套接字上的 BeginAccept 之后什么时候可以告诉我的监听器线程它可以再次开始接受连接。

这是我的代码:

while(!mStopWaitHandle.WaitOne(0, false)) // <-- Manual Reset event to check if the service has stopped.
{
Logging.Debug("Waiting for a connection...");

socket.BeginAccept(new AsyncCallback(AcceptConnection), socket);

mReadyToAcceptWaitHandle.WaitOne(); // <-- AutoResetEvent to block until I can continue accepting connections
}

然后在我的异步回调中:

private void AcceptConnection(IAsyncResult ar)
{
mReadyToAcceptWaitHandle.Set(); // <-- Tell the listener thread to start accepting connections again

Socket socket = (Socket)ar.AsyncState;
Socket workerSocket = socket.EndAccept(ar);

... handle connection on workerSocket ...
}

这就是他们在 Asynchronous Server Socket Example on msdn 中的做法.

但据我所知,BeginAccept 不是阻塞调用。阻塞调用是 EndAccept,它会阻塞直到有一个连接要接受。

所以在 EndAccept() 之前让 mReadyToAcceptWaitHandle.Set(); 告诉监听器线程继续接受连接对我来说似乎很奇怪,因为这不会导致它继续打开 AcceptConnection 处理程序线程(从我从执行中看到的情况来看,它似乎没有这样做,但我不知道为什么?)所有这些都只是阻塞在 EndAccept 上?

EndAccept 之后有 mReadyToAcceptWaitHandle.Set(); 不是更好吗,这样它一次只处理接受一个连接,一旦它有已接受,但在它实际处理连接上的通信之前。

这两种方法似乎都有效,但我想知道哪种方法是正确的,以及一种方法是否会产生另一种方法没有的微妙负面影响。

我在这里错过了什么?

提前致谢。

最佳答案

阻塞调用是 EndAccept,它会一直阻塞直到有连接要接受。

这不是一个准确的描述。

EndAccept 在从客户端接收到连接请求时从 BeginAccept 的回调中调用。您可以从 BeginAccept 回调中再次调用 BeginAccept 以立即接受另一个连接,同时建立您刚刚通过 EndAccept 收到的(先前的)连接(仍在连接回调)。

因此实际上根本不需要使用事件来同步何时接受新连接。只需从回调中再次调用 BeginAccept

关于c# - 在 EndAccept() 之前或之后开始接受新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24356115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com