Это ошибка ReceiveFromAsync ()? - PullRequest
       9

Это ошибка ReceiveFromAsync ()?

3 голосов
/ 27 апреля 2011

это мой первый вопрос, и я не являюсь носителем английского языка, поэтому извините за мой (возможно) неточный английский.

Я использую сетевой движок в реальном времени и использую метод Socket.xxxAsync ().

Я сделал сокет UDP на стороне сервера следующим образом.

m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_udpSock.Bind(new IPEndPoint(IPAddress.Any, udpPort));
SocketAsyncEventArgs udpRecvArg = new SocketAsyncEventArgs();
udpRecvLoopStart(m_udpSock, udpRecvArg);

(udpPort известен клиенту.)

    private void udpRecvLoopStart(Socket udpSocket, SocketAsyncEventArgs udpRecvArg)
    {            
        udpRecvArg.AcceptSocket = udpSocket;
        byte[] udpRecvBuffer = new byte[NetworkEngineConst.MsgSizeMax];
        udpRecvArg.SetBuffer(udpRecvBuffer, 0, udpRecvBuffer.Length);
        udpRecvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        udpRecvArg.Completed += new EventHandler<SocketAsyncEventArgs>(udpRecvArg_Completed);

        udpRecv(udpRecvArg);
    }

    private void udpRecv(SocketAsyncEventArgs udpRecvArg)
    { 
        bool synchronous = false;
        try
        {                
            synchronous = !udpRecvArg.AcceptSocket.ReceiveFromAsync(udpRecvArg);
        }
        catch (Exception e)
        {
            OnIOError("recvUdp()\n" + e.ToString());
            return;
        }
        if (synchronous)
            udpRecvArg_Completed(this, udpRecvArg);
    }

Завершенный обработчик событий:

    void udpRecvArg_Completed(object sender, SocketAsyncEventArgs udpRecvArg)
    {
        EndPoint udpEp = udpRecvArg.RemoteEndPoint;            
        string msg = Encoding.UTF8.GetString(udpRecvArg.Buffer, 14, udpRecvArg.BytesTransferred - 14);
        Debug.WriteLine(udpEp + " " + msg);
        udpRecv(udpRecvArg);            
    }

(первые 14 байтов - это префикс сообщения, CRC и порядковый номер)

И два (или более) клиента отправляют пакет UDP на сервер.(скорость отправки составляет сотни в секунду)

Например, client1 (192.168.0.1:50113) отправляет «11111111111111111111111111111», client2 (192.168.0.1:59368) отправляет «2».

Ноиногда (не всегда) конечная точка неверна.журнал как показано ниже:

192.168.0.1: 50113 11111111111111111111111111111

192.168.0.1: 50113 11111111111111111111111111111

192.168.0.1 * 50113 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110: 59368 2

192.168.0.1: 59368 2

192.168.0.1: 50113 1111111111111111111111111111

192.168.0.1: 59368 111111111111111111111111111 * часть * 10351036 * 192.168.0.1: 59368 2

192.168.0.1: 50113 11111111111111111111111111111

192.168.0.1: 50113 11111111111111111111111111111

111111111111111111111111111111111112

192.168.0.1: 59368 2

192.168.0.1: 50113 11111111111111111111111111111

192.168.0.1: 59368 2

192.168.0.1: 59368 2

Я сомневаюсь в ошибке пакета, но в пакете не было ошибки (я подтвердил с помощью Wireshark)

Это ошибка?

(Добавить)

Я пытался

        m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        m_udpSock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
        m_udpSock.Bind(new IPEndPoint(IPAddress.Any, udpPort));

и заменил ReceiveFromAsync () на ReceiveMessageFromAsync ().

, но SocketAsyncEventArgs.ReceiveMessageFromPacketInfo.Address имеет значение null

(Добавить) Проблема ReceiveMessageFromAsync () является ошибкой.

Исправлена ​​в .NET Framework 4.0

здесь

спасибо.

1 Ответ

1 голос
/ 27 апреля 2011

Возможно, попробуйте использовать Socket.ReceiveMessageFromAsync , а затем получить пакетные данные, используя ReceiveMessageFromPacketInfo .

FYI этот является альтернативным способом сделать это (см. Редактирование в ответе)

HTH

...