有一个使用 .NET Socket 和 TCP 协议的单线程服务器,以及Socket.Pool()
, Socket.Select()
, Socket.Receive()
.
要发送,我使用了:
public void SendPacket(int clientid, byte[] packet)
{
clients[clientid].socket.Send(packet);
}
但是当向一个客户端发送大量数据(停止整个主线程)时它非常慢,所以我用这个替换它:
public void SendPacket(int clientid, byte[] packet)
{
using (SocketAsyncEventArgs e = new SocketAsyncEventArgs())
{
e.SetBuffer(packet, 0, packet.Length);
clients[clientid].socket.SendAsync(e);
}
}
它在带有 .NET 的 Windows 上运行良好(我不知道它是否完美),但在带有 Mono 的 Linux 上,数据包要么被丢弃,要么被重新排序(我不知道)。使用 Socket.Send() 恢复到慢速版本适用于 Linux。整个服务器的来源。
如何编写适用于 Linux 的非阻塞 SendPacket() 函数?