【问题标题】:C# A request to send or receive data was disallowed because the socket is not connectedC# 不允许发送或接收数据的请求,因为套接字未连接
【发布时间】:2014-08-30 16:59:09
【问题描述】:

所以我试图发送一个数据包,但我一直收到这个错误

任何帮助都会很棒!

非常感谢!

错误信息: 不允许发送或接收数据的请求,因为套接字未连接并且(使用 sendto 调用在数据报套接字上发送时)未提供地址

代码:

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] packetData = Encoding.ASCII.GetBytes(textBox1.Text);

        const string ip = "127.0.0.1";
        const int port = 5588;


        var ep = new IPEndPoint(IPAddress.Parse(ip), port);


        var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        client.SendTo(packetData, ep);
    }
}

}

【问题讨论】:

  • 你试过连接Socket吗?
  • 我对您的代码进行了更正;你已经创建了端点和套接字;您需要使用 Endpoint 作为参数调用 Socket 上的 Connect。

标签: c# sockets


【解决方案1】:
private void button1_Click(object sender, EventArgs e)
{
    byte[] packetData = Encoding.ASCII.GetBytes(textBox1.Text);

    const string ip = "75.126.77.26";
    const int port = 5588;


    var ep = new IPEndPoint(IPAddress.Parse(ip), port);


    var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    client.Connect(ep);
    client.SendTo(packetData, ep);
}

为了清楚起见,添加了这一行:

    client.Connect(ep);

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是在调用client.SendTo 之前调用client.Connect。您还需要在调用 connect 后调用 client.Connected 以确保您已连接。

    此帮助页面有一个使用套接字对象的示例:http://msdn.microsoft.com/en-us/library/2b86d684%28v=vs.110%29.aspx

        // Connect to the host using its IPEndPoint.
        s.Connect(hostEndPoint);
    
        if (!s.Connected)
        {
          // Connection failed, try next IPaddress.
          strRetPage = "Unable to connect to host";
          s = null;
          continue;
        }
    

    【讨论】:

    • 像这样使用 Connected 属性是没有用的。这将永远是真的。我不确定为什么每个人都这样做。即使它可能是错误的,这种错误处理也无济于事。
    【解决方案3】:

    var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

    这将创建一个使用 TCP(流协议)的套接字。如果你想在面向连接的套接字上调用Socket.SendTo,你必须首先通过调用Socket.Connect来连接它。

    如果您只打算发送数据报,最好使用 UDP 代替,它根本不需要连接。

    var client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 2013-07-31
      • 1970-01-01
      • 2013-02-03
      • 2018-07-01
      • 2013-11-24
      • 2021-08-16
      • 2018-06-20
      • 2021-10-11
      相关资源
      最近更新 更多