【发布时间】: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) ;感谢您的帮助