TCP 프로토콜을 사용하는 .NET 소켓을 사용하는 단일 스레드 서버가 있고 Socket.Pool()
, Socket.Select()
, Socket.Receive()
입니다. 보내려면Socket.SendAsync가 Mono/Linux에서 순서대로 전송되지 않습니다.
, 내가 사용 :
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에서 작동합니다. Source for whole server.
Linux에서 작동하는 non-blocking SendPacket() 함수를 작성하는 방법은 무엇입니까?
대기열은 SendAsync가 내부적으로 수행하기 때문에 불필요합니다. – Marlon
아, 아니. SendAsync는 OP가 경험했기 때문에 mulötipel 호출을 다중 행 스레드에 넣습니다. Quarantess가 없습니다. SendAsync에 대한 4 건의 호출이 올바른 순서로 처리됩니다. – TomTom