Существует однопоточный сервер, использующий .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);
}
}
Он отлично работает в Windows с .NET (я не знаю, идеально ли это), но в Linux с Mono пакеты либо отбрасываются, либо переупорядочиваются (не знаю). Возврат к медленной версии с Socket.Send () работает в Linux. Источник для всего сервера .
Как написать неблокирующую функцию SendPacket (), которая работает в Linux?