为什么UDPSocket.SendAsync()需要connect()方法才能工作?

时间:2018-12-30 11:05:27

标签: c# .net sockets sendasync

然后我在C#中使用XXXAsync方法和socketeventargs 在测试我的控制台应用程序时,未发送数据(在PC本地),并且在发送方应用程序中此代码未引发任何错误。

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("++++++++++++++++++++++++");
}

但是,当取消对try catch块中的connect()代码进行注释时,此应用程序成功发送了数据。

FlashUDP.SendTo("dat1", send_ipep);

用于

FlashUDP.SendAsync(Sock_Args);

我是否缺少某些东西,或者是udp的工作方式?

"SentTo()" 

在没有连接的情况下工作

"SendAsync()"

也应该在没有连接的情况下工作。 对于客户端来说,连接不是问题,但是对于服务器来说,这是一个问题,因为它必须处理许多客户端。 当我不绑定()接收器时,数据不会被发送出去。 有什么解决办法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

根据SendTo documentation,这是预期的行为:

  

如果您使用的是无连接协议(由我添加:UDP是),则在调用SendTo之前不需要使用Connect方法建立默认的远程主机。仅在打算调用Send方法时才需要这样做。

SendAsync documentation(SendAsync与前面提到的Send异步等效)然后指出:

  

如果您不先调用Accept,AcceptAsync,BeginAcceptBeginConnect,Connect或ConnectAsync,SendAsync方法将引发异常。

如果您想要与SendTo相同的行为,则应使用SendToAsync

  

如果使用的是无连接协议,则无需在调用SendToAsync之前使用BeginConnect,Connect或ConnectAsync方法建立默认的远程主机。仅当您打算调用BeginSend或SendAsync方法时,才需要这样做。