c#TCP / IP通信错误:在自己的上下文中请求的地址无效

时间:2014-07-18 16:39:12

标签: c# sockets tcp

正如其他SO问题所示,我遵循了本教程https://www.youtube.com/watch?v=ObcGBT4ZWEU 这适用于局域网,但是当我尝试使用从任何Web服务获取的IP并使用端口80进行互联网时,它会在图像中显示错误 error

意大利语部分是“在自己的上下文中请求无效的地址”(我不知道这是否是此错误的英文文本) “开始”按钮(按钮1)出现错误。代码是:

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            epLocal = new IPEndPoint(IPAddress.Parse(textLocalIp.Text), Convert.ToInt32(textLocalPort.Text));
            sck.Bind(epLocal);

            epRemote = new IPEndPoint(IPAddress.Parse(textFriendsIp.Text), Convert.ToInt32(textFriendsPort.Text));
            sck.Connect(epRemote);

            byte[] buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

            button1.Text = "Connected";
            button1.Enabled = false;
            button2.Enabled = true;
            textMessage.Focus();

        }
        catch (Exception exp)
        {
            MessageBox.Show(exp.ToString());
        }

    }

套接字变量声明为global:

    Socket sck;
    EndPoint epLocal, epRemote;

并初始化为:

        sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

有什么建议吗?!谢谢!

编辑:我成功得到一个englsh错误! enter image description here 在意大利语版本中我也有精确的线条,它是:

sck.Bind(epLocal);

1 个答案:

答案 0 :(得分:1)

您尚未告诉我们textLocalIp.Text的价值是什么,但问题可能就在那里。

您无法绑定到任何IP地址,它必须是您计算机中某个网卡的地址,或0.0.0.0表示“任何”。尝试使用路由器的公共IP地址或朋友的IP地址将无法正常工作。

大多数情况下,您应该跳过调用Bind并让Windows选择本地地址和端口。如果您需要特定端口,请使用INADDR_ANY 0.0.0.0以及该端口进行绑定。