TCPプロトコルの.NETソケットを使用するシングルスレッドサーバーがあり、Socket.Pool()
,Socket.Select()
,Socket.Receive()
です。送信するにはMono/LinuxでSocket.SendAsyncが順序通りに送信されていません
、私が使用:
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上で正常に動作します(完璧かどうかわかりません)が、LinuxではMonoでパケットが破棄されるか並べ替えられます(わかりません)。 Socket.Send()を使って遅いバージョンに戻すことは、Linux上で動作します。 Source for whole server。
Linuxで動作するnon-blocking SendPacket()関数の記述方法は?
キューは不要です。これは、SendAsyncが内部的に行うためです。 – Marlon
ああ、いいえ。 SendAsyncはマルチプルスレッドにmulötipel呼び出しを行います。これは、OPが経験したように間違っているかもしれません。 QuarantessはありませんSendAsyncへの4回の呼び出しは正しい順序で処理されます。 – TomTom