gpt4 book ai didi

c# - 发送时无法立即完成非阻塞套接字操作

转载 作者:太空狗 更新时间:2023-10-30 00:55:22 25 4
gpt4 key购买 nike

我正在为游戏编写服务器,我希望能够处理数千个并发用户。出于这个原因,我选择了非阻塞套接字并使用 poll 方法。但是,我确实创建了多个线程来处理数据库和 Web 调用,其中一些线程会向用户发送响应。在其中一个线程中,在发送时,我收到错误消息“无法立即完成非阻塞套接字操作”。是什么导致了这个问题?我想这是因为在调用发送的同时进行了轮询。如果我使用 beginAsync,它会停止这个错误吗?我考虑过锁定套接字,但我不希望为此阻塞我的主线程。

最佳答案

我不知道您使用的是哪种非阻塞轮询套接字调用,但我建议您使用Async 套接字调用(而不是 Begin)。有关异步调用与 Begin 之间区别的更多信息,请参阅:What's the difference between BeginConnect and ConnectAsync?

异步调用会自动在操作系统级别进行“轮询”,这将比您的轮询更有效率。事实上,它们使用 IO 完成端口,这可能是您可以在 Windows 上用来处理大量客户端连接/请求的最快和最有效的方法。

至于错误,我认为这是非阻塞套接字的正常运行,所以你只需要优雅地处理它。

更新

你的服务器可能应该做这样的事情:

// Process the accept for the socket listener.
private void ProcessAccept(SocketAsyncEventArgs e)
{
Socket s = e.AcceptSocket;
if (s.Connected)
{
try
{
SocketAsyncEventArgs readEventArgs = this.readWritePool.Pop();
if (readEventArgs != null)
{
// Get the socket for the accepted client connection and put it into the
// ReadEventArg object user token.
readEventArgs.UserToken = new Token(s, this.bufferSize);

Interlocked.Increment(ref this.numConnectedSockets);
Console.WriteLine("Client connection accepted.
There are {0} clients connected to the server",
this.numConnectedSockets);

if (!s.ReceiveAsync(readEventArgs))
{
this.ProcessReceive(readEventArgs);
}
}
else
{
Console.WriteLine("There are no more available sockets to allocate.");
}
}
catch (SocketException ex)
{
Token token = e.UserToken as Token;
Console.WriteLine("Error when processing data received from {0}:\r\n{1}",
token.Connection.RemoteEndPoint, ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

// Accept the next connection request.
this.StartAccept(e);
}
}

代码示例由代码项目提供:http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class

关于c# - 发送时无法立即完成非阻塞套接字操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9844263/

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