Socket.Pool()
TCP プロトコルで.NET SocketSocket.Select()
を使用するシングルスレッド サーバーがあり、、、Socket.Receive()
.
送信するには、次を使用しました:
public void SendPacket(int clientid, byte[] packet)
{
clients[clientid].socket.Send(packet);
}
しかし、1 つのクライアントに大量のデータを送信すると (メイン スレッド全体が停止して) 非常に遅くなったため、次のように置き換えました。
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 では、パケットが破棄されるか、並べ替えられます (わかりません)。Linux では、Socket.Send() を使用して低速バージョンに戻すことができます。サーバー全体のソース。
Linux で動作するノンブロッキング SendPacket() 関数を作成するには?