Почему для работы UDPSocket.SendAsync () требуется метод connect ()? - PullRequest
0 голосов
/ 30 декабря 2018

Я работал с методами XXXAsync и socketeventargs в c #, тогда при тестировании моего консольного приложения данные не отправлялись (локально - на ПК), и с этим кодом в приложении-отправителе не было выдано никакой ошибки.

public class Client
{
    private static Socket FlashUDP = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    private static IPEndPoint send_ipep = new IPEndPoint(IPAddress.Parse("192.168.100.41"), 14086);
    private static IPEndPoint rec_ipep = new IPEndPoint(IPAddress.Parse("192.168.100.41"), 14085);
    private static SocketAsyncEventArgs Sock_Args = new SocketAsyncEventArgs();
    private static SocketAsyncEventArgs Sock_Args2 = new SocketAsyncEventArgs();

private static byte[] dat1 = new byte[10];

//This function is called at main
private static void starter()
{
    Sock_Args.RemoteEndPoint = send_ipep;          
    Sock_Args.Completed += Sock_Args_Completed;
    string st = "ping";
    byte[] msg = Encoding.ASCII.GetBytes(st);
    Sock_Args.SetBuffer(msg, 0, 4);

   // FlashUDP.SendTo(msg, rec_ipep);
    try
    {            
        FlashUDP.Bind(rec_ipep);
       // FlashUDP.Connect(send_ipep);
        FlashUDP.SendAsync(Sock_Args);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }

    Console.WriteLine("Sending...");
}

private static void Sock_Args_Completed(object sender, SocketAsyncEventArgs e)
{
    Console.WriteLine("sent sucessfully ");
    Console.WriteLine("++++++++++++++++++++++++");
}

Но это приложение успешно отправило данные, когда этот код connect () в блоке try catch не был прокомментирован.Он также отправлял данные, когда

FlashUDP.SendTo("dat1", send_ipep);

использовался вместо

FlashUDP.SendAsync(Sock_Args);

Я что-то упустил или это так работает UDP?То, что я предполагал, если

"SentTo()" 

работает без подключения, то

"SendAsync()"

также должно работать без подключения.Подключение не является проблемой для клиента, но это проблема для сервера, так как приходится иметь дело со многими клиентами.плюс данные не передаются, когда я не связываю () получателя.Есть ли решение для этого?Спасибо!

1 Ответ

0 голосов
/ 30 декабря 2018

Согласно документации SendTo это ожидаемое поведение:

Если вы используете протокол без установления соединения [добавлено мной: что такое UDP], вам не нужноустановите удаленный хост по умолчанию с помощью метода Connect до вызова SendTo.Это необходимо сделать только в том случае, если вы намереваетесь вызвать метод Send.

Документация SendAsync (с SendAsync, являющимся асинхронным эквивалентом Send, упомянутым ранее), затем заявляет:

Метод SendAsync вызовет исключение, если вы сначала не вызовете Accept, AcceptAsync, BeginAcceptBeginConnect, Connect или ConnectAsync.

Если вы хотите использовать то же поведение, что и SendTo, вы должны использовать SendToAsync :

Если вы используете протокол без установления соединения, вам не нужноустановите удаленный хост по умолчанию с помощью метода BeginConnect, Connect или ConnectAsync до вызова SendToAsync.Это необходимо делать только в том случае, если вы собираетесь вызывать методы BeginSend или SendAsync.

...