gpt4 book ai didi

c# - TcpListener Pending 方法返回错误的值

转载 作者:行者123 更新时间:2023-11-30 17:14:51 26 4
gpt4 key购买 nike

我的服务器端有以下代码:

// Bind to a specific local port number (SERVER_PORT) and any local IP address.
m_tlServer = new TcpListener(IPAddress.Any, SERVER_PORT);

// Start listening for connection attempts.
m_tlServer.Start();

// Start accepting new clients.
// Sleep until a new client(s) will try to connect to the server.
while (!m_bStopThread)
{
if (!m_tlServer.Pending())
{
// Sleep and try again.
Thread.Sleep(LISTENING_SLEEP_TIME);
continue;
}
else
{
// Accept a new client in a new thread.
Thread newthread = new Thread(new ThreadStart(HandleNewConnection));
newthread.Start();
}
}

我的问题是,当客户端尝试连接到服务器时,Pending 方法多次返回 true(通常为 4 次)并创建了多个线程。我试图用使用 AcceptTcpClient 方法的循环替换 while 循环(不知道是否有任何连接尝试)并且它工作正常。所以,我认为问题是由 Pending 方法引起的。谁能帮我?谢谢,奥弗。

最佳答案

使用 AcceptTcpClient 而不是 Pending 它将起作用。

为什么你正在做的是产生这些步骤:

  1. 监听器线程看到 Pending == true
  2. 开始接受话题
  3. 监听器线程看到 Pending == true
  4. 开始接受话题
  5. 监听器线程看到 Pending == true
  6. 开始接受话题
  7. 首先accept线程开始运行
  8. 监听器线程看到 Pending == false

简而言之,这并不是因为您启动了一个线程,所以其中的一些随机指令会立即执行。线程的要点就是:稍后执行。

如果你想有办法停止监听过程,请使用 WaitHandles :

// In your class somewhere stopEvent is a ManualResetEvent

while(true)
{

var asyncResult = listener.BeginAcceptTcpClient(null, null);

var waitHandles = new [] { stopEvent, asyncResult.AsyncWaitHandle };

var waitResult = WaitHandle.WaitAny(waitHandles);

if (waitResult == 0) return;

var client = EndAcceptTcpClient(asyncResult);
// Create thread to speak with this client

}

你想要停止线程的方法只需要 stopEvent.Set()

关于c# - TcpListener Pending 方法返回错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8370105/

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