【问题标题】:c# TCP/IP communication error: Address requested non valid in own contextc# TCP/IP 通信错误:地址请求在自己的上下文中无效
【发布时间】:2014-07-19 05:59:38
【问题描述】:

正如另一个 SO 问题中所建议的那样,我遵循了本教程 https://www.youtube.com/watch?v=ObcGBT4ZWEU 这适用于局域网,但是当我使用从任何 Web 服务获取的 IP 并使用端口 80 通过 Internet 尝试时,它会在图像中出现错误

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

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

    }

套接字变量被声明为全局变量:

    Socket sck;
    EndPoint epLocal, epRemote;

并初始化为:

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

有什么建议吗?!谢谢!!

编辑:我成功收到英文错误!!! 在意大利语版本中,我也有准确的路线,它是:

sck.Bind(epLocal);

【问题讨论】:

  • 您是否有您使用的有效 IP?如果它在本地局域网上工作,听起来你可能使用了错误的 IP 地址。您是在公司环境中还是在家中连接?如果在家里,您可能想使用whatsmyip.org 查看您的本地 IP,因为很可能您的路由器正在进行 NAT 转换。这也可能意味着远程 IP 未在该端口上侦听。您可以尝试执行 telnet 并查看是否连接。抛出异常是哪一行?
  • 转到grc.com/shieldsup,然后按继续,向下滚动到可以选择端口扫描的位置“那里你可以看到你是互联网提供商的IP”并扫描你的计算机以查找开放端口,如果需要。
  • @Mike 我有一个获取客户端所有者 IP 的功能(比使用该程序的 2 个人应该共享 IP)。我正在使用checkip.dyndns.org 我会尝试远程登录,也就是说如果其他人必须将端口 80 转发到他的电脑,甚至使用新端口。 (8080 ?) Creator 我做了这个测试,80 处于“隐身”状态并且是“http”......不知道这意味着什么......哈哈顺便说一句,引发错误的行是 sck.Connect(epRemote) ;感谢您的帮助

标签: c# sockets tcp


【解决方案1】:

您还没有告诉我们textLocalIp.Text 的值是多少,但问题可能出在那儿。

您不能只绑定到任何 IP 地址,它必须是您计算机中的一个网卡的地址,或者0.0.0.0 表示“任何”。尝试使用您的路由器的公共 IP 地址或您朋友的 IP 地址将不起作用。

大多数时候,您应该跳过调用Bind 并让Windows 选择本地地址和端口。如果你想要一个特定的端口,那么使用INADDR_ANY(即0.0.0.0)与该端口一起绑定。

【讨论】:

  • 好吧,我想我使用了朋友用来连接我的相同 ip,作为本地 ip,反之亦然。使用我在 cmd 中使用 ipconfig 找到的 ip(我认为是 ipv4 ip 地址, 192.168.x.y )它工作得很好!然后我可以使用一个函数来自动完成本地 ip,如 youtube 教程中所示。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2022-01-02
  • 2022-01-07
  • 2020-12-25
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多