C# Socket CS模式 局域网可以连接,公网IP无法连接问题

Michaellovekobe 2015-05-05 03:32:06
1.很简单的客户端-服务器模式。在局域网下测试没有没问题。C-S之间可以实现通信。但如果通过公网连接就是不行,压根客户端连不到服务器。
代码如下。只写监听、连接部分。

服务器端:
newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_port = 7000;
IPAddress serverIP = IPAddress.Parse("220.131.112.45");
localEP = new IPEndPoint(serverIP, server_port);
try {
//绑定
newsock.Bind(localEP);
//监听
newsock.Listen(10);

//开始接受连接,异步。
newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

2.这里就有个问题,如果bind的公网IP的话。压根服务器bind就会出错,报“在其上下文中,该请求的地址无效”错误。
3.如果将公网IP地址,变成IPAddress.Any,则可以bind并启动监听。但客户端,使用公网IP和端口连接不上。报"由于连接放在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败"错误


客户端:
newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string ipadd ="220.131.112.45";
int port = 7000;
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);
try
{
newclient.Connect(ie);
}
catch (SocketException e)
{
MessageBox.Show("连接服务器失败 " + e.Message);
return;
}


4.值得说明的是本机的端口是做了端口映射的。220.131.112.45和7000是我举例的IP和端口非实际的。不用再测试IP是否能ping通和或在线测试端口是否打开了。有个相同功能的软件可以在本机使用,也是用的此IP和端口。而且也用了一款软件来测试否是公网IP状态和是否端口映射,显示是没错的。
...全文
849 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
十月某一天 2017-05-23
  • 打赏
  • 举报
回复
soctet广域网无法连接,请赐教
菜瑛 2015-12-01
  • 打赏
  • 举报
回复
我跟你是同样的模式,但是通过公网连接只能连接一个客户端第二个就连接不上了,还望楼主赐教
linxiaolong_098 2015-08-04
  • 打赏
  • 举报
回复
那个NAT是什么东西啊,我也碰到和你一样的问题,能说一下吗
Michaellovekobe 2015-06-06
  • 打赏
  • 举报
回复
问题解决了,不过是通过NAT 貌似我公司端口未开
於黾 2015-05-05
  • 打赏
  • 举报
回复
对于外网和内网,服务端程序并无区别 问题是你得有外网IP,才行 如果你是通过路由器连接的外网,那么你需要在路由器里做映射,将路由器的外网IP映射到你内网的服务端所在的IP 也就是说,外网数据包发给路由器之后,路由器必须得能够将数据包转发给你的服务端才行 毕竟你的程序是放在计算机上,而不是路由器里 除非你计算机直接连外网,那么就不需要设置任何东西
Michaellovekobe 2015-05-05
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
localEP = new IPEndPoint(serverIP, server_port); 你确定这里填写serverIP? bind表示你要监听的IP和端口 你设置成serverIP,就是只有从这个IP来的数据包才侦听,其他IP来的数据包都直接丢弃了 你应该填写IPAddress.Any才对啊
您有否可以用外网通信的实例,发我一份,我对照看下,找下我的问题。
Michaellovekobe 2015-05-05
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
先在局域网里测试成功了,再发布到外网上去 按你这个写法,除了本机能访问这个服务,在局域网里的其他机器也一样无法访问的
我是这样,自己又做服务器,又做客户端的。方便测试。我改成any就会出现上边我写的问题。 3.如果将公网IP地址,变成IPAddress.Any,则可以bind并启动监听。但客户端,使用公网IP和端口连接不上。报"由于连接放在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败"错误
於黾 2015-05-05
  • 打赏
  • 举报
回复
先在局域网里测试成功了,再发布到外网上去 按你这个写法,除了本机能访问这个服务,在局域网里的其他机器也一样无法访问的
於黾 2015-05-05
  • 打赏
  • 举报
回复
localEP = new IPEndPoint(serverIP, server_port); 你确定这里填写serverIP? bind表示你要监听的IP和端口 你设置成serverIP,就是只有从这个IP来的数据包才侦听,其他IP来的数据包都直接丢弃了 你应该填写IPAddress.Any才对啊

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧