路由端口映射后,socket应该如何建立才能与其他网络用户相互通信

laaling 2010-05-10 11:06:10
例如PC机A本地地址为192.168.1.109,外网地址为112.xx.xx.xx

那么在路由上将端口4567绑定192.168.1.109,
端口映射之后,其他网络的用户访问112.xx.xx.xx:4567时就能直接访问PC机A,

例如PC机A架设了web服务器,那么其他网络的用户访问112.xx.xx.xx:4567时就能浏览PC机A提供的页面

可是现在的问题是,如果PC机A不是web服务器,而是一个采用socket套接字的CS服务端,那么上面的端口映射就会出现问题,

服务端的CS在建立socket时,应该绑定什么地址,
若是绑定本地地址192.168.1.109,那么会出现,客户端仍然能够访问PC机的CS服务器,但是服务器在使用socket套接字给客户端发送信息时,服务端发送成功,但是客户端并没有接收响应,(环境是服务器,客户端都在同一个路由下,但是网关不同,路由上做了设置,服务器的网关是192.168.1.1,而客户端的网关是192.168.1.2),环境有限,没有做其他的测试...
若是绑定外网地址112.xx.xx.xx,那也说不过去,毕竟这是一个不属于PC机A的地址,尝试绑定后也证实绑定不成功


那我的问题是,使用路由端口映射后,PC机A如何使用socket套接字与任意客户端(通过外网地址链接)相互通信
或者有什么方法能架设使用socket套接字的服务器
...全文
950 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tprax634 2010-05-10
  • 打赏
  • 举报
回复
肯定是绑定192.168.1.109啊,你想让外网访问你绑定成192.168.1.109是不可能错的。错的是其余的地方。
怎么可能是127.。。我晕,127是自己才能访问的地址。
还有,你的路由情况很奇怪。你的服务器按道理应该是不经过网关直接访问客户端,毕竟是同一个网段啊。
你试一下双方ping通,确认一下路由情况。若ping包正常,但是客户端没recv你的消息,说明你的程序问题。
laaling 2010-05-10
  • 打赏
  • 举报
回复
绑127.0.0.1好像连局域网内的客户端也不能连上服务器吧
wangk 2010-05-10
  • 打赏
  • 举报
回复
绑127.0.0.1试试
wangk 2010-05-10
  • 打赏
  • 举报
回复
你既然要向客户端发送udp数据需要满足如下条件:
1.客户端在监听UDP端口
2.客户端前头的路由器开启UPNP,并且和客户端的UDP端口绑定(在路由器的UPNP列表里能看到)
3.服务端能够得到客户端前头的路由器IP和映射的端口
4.最后发送udp封包给路由器IP:映射的端口

调试的时候一个个看这些条件是否符合。
wgm001 2010-05-10
  • 打赏
  • 举报
回复
0.0.0.0
laaling 2010-05-10
  • 打赏
  • 举报
回复
也就是,在打洞时,充当服务器的机子能不能使用端口映射来充当
laaling 2010-05-10
  • 打赏
  • 举报
回复
嗯,不好意思,是我讲的不够清楚,打洞是有的,这也是为什么把服务端放到公网上服务端和客户端都正常的原因,
而我想知道的是当路由映射的时候,我在客户端链接时是使用公网地址链接时,客户端是以什么方式链接服务端,是用什么地址链接服务端的,是否通过nat转发...
既然服务端能监听到有客户端链接,但是为什么发送给客户端时就失败了???
wangk 2010-05-10
  • 打赏
  • 举报
回复
客户端也在路由器后面,如果没有打洞的话,服务器发往客户端的包,客户端收不到是很正常的。
laaling 2010-05-10
  • 打赏
  • 举报
回复
防火墙就没有了,至于路由器,那在局域网内,肯定是在路由器后面的,

还有一点要明确的是,只要把服务器放到公网上,那服务器和客户端都正常了,
wangk 2010-05-10
  • 打赏
  • 举报
回复
udp的话对方的IP和port可以从你服务器访问到吗?

也就是说对方是在防火墙或者路由器后面吗?路由器开了UPNP吗?防火墙开放端口了吗?
laaling 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangk 的回复:]
路由NAT的时候指定的协议和你所用的一致吗TCP/UDP?
[/Quote]

不太明白ls的意思

我用的是udp,路由映射的时候,tcp和udp协议都选上了
wangk 2010-05-10
  • 打赏
  • 举报
回复
路由NAT的时候指定的协议和你所用的一致吗TCP/UDP?
laaling 2010-05-10
  • 打赏
  • 举报
回复
服务器是正常的,服务器能够接收到客户端的链接信息,可就当客户端链接后,服务端给客户端发送消息时,此消息在服务端来看发送成功,返回值和返回大小都正常,但是在客户端,什么也没有接收到,甚至连触发也没有
wangk 2010-05-10
  • 打赏
  • 举报
回复
调试一下服务端看看,是否是正确得到连接封包之类的?
laaling 2010-05-10
  • 打赏
  • 举报
回复
嗯,现在我绑的是0.0.0.0,
只要把服务端搬到公网上,服务器与客户端都正常,

可是只要把服务端搬到局域网内,然后做路由映射的话,客户端链接服务端时,服务端能接收到客户端的信息,但是服务端发给客户端时,客户端就没有反映了

还有就是当前测试的局域网是日常正在使用的局域网,也没有发现网络有什么不正常的现象
oyljerry 2010-05-10
  • 打赏
  • 举报
回复
已经绑定了,那么服务器就可以用公网地址+端口来访问,客户端直接访问这个...
建立连接后,C/S就可以互相通信了
Eleven 2010-05-10
  • 打赏
  • 举报
回复
服务器bind IP:192.168.1.109和port,路由器上做映射
wangk 2010-05-10
  • 打赏
  • 举报
回复
记错了,难道是绑0.0.0.0?

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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