【问题标题】:Why does UDPSocket.SendAsync() requires connect() method to work?为什么 UDPSocket.SendAsync() 需要 connect() 方法才能工作?
【发布时间】:2018-12-30 11:05:27
【问题描述】:

我当时在 c# 中使用 XXXAsync 方法和 socketeventargs 在测试我的控制台应用程序时,没有发送数据(本地 - 在电脑内),并且此代码在发件人应用程序中没有引发错误。

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()"

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

【问题讨论】:

  • 你是否设法在没有Connect 的情况下使用SendTo
  • @ckuri 这不是等待/异步,它是旧类型的回调异步
  • @MikeNakis 是的 SendTo() 没有 Connect() 工作

标签: c# .net sockets sendasync


【解决方案1】:

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

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

SendAsync documentation(SendAsync 是前面提到的 Send 的异步等效项)然后声明:

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

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

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

【讨论】:

  • 啊哈.. 非常感谢兄弟!
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2012-07-13
  • 2017-08-14
相关资源
最近更新 更多