服务器监听地址问题,求大神帮忙!【急急急】

clirus 2015-07-27 03:40:07
服务器里面采用下面的代码来绑定监听地址。
addr.sin_addr.s_addr = htonl(INADDR_ANY);
程序运行后,在服务器内部通过回环地址127.0.0.1自测是ok的,但是在其他电脑上用client输入服务器真实IP进行远程连接则失败,通过抓包来看,服务器返回了RST包,导致TCP连接无法建立。
这时候通过netstat -an观察网络状态发现:
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9990 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN

我自己开的服务的地址是127.0.0.1,不是0.0.0.0也不是服务器真实IP。
个人觉得应该是0.0.0.0

如果将INADDR_ANY换成是服务器真实的IP,则远程调试是ok的,而且netsta -an也可观察到 真是IP:端口。但是在这个情况下,服务器内部回环测试无法进行。

求帮忙。

先谢过!
...全文
556 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snaler 2015-07-29
  • 打赏
  • 举报
回复
我试了一下,都是ok的,所以觉得应该是你自己代码的问题,check一下,有没有什么地方是默认设置成了127.0.0.1。如果是的话,同学,以后可要细心一点。
clirus 2015-07-29
  • 打赏
  • 举报
回复
引用 5 楼 xmt1139057136 的回复:
哪个端口是你自己的,你在监听哪个端口??? TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。
在什么时候才会出现监听127.0.0.1的情况?
clirus 2015-07-29
  • 打赏
  • 举报
回复
引用 6 楼 chmuggmwtg 的回复:
我查了下书 RST:“基准连接”出现错误,发RST 基准连接指目的IP与端口,源IP与端口。 个人理解:服务器用回环Ip地址与客户端连接的ip地址不一样,导致了。 疑问:服务端都用真实IP,应该也可以测试吧?
是的,服务端用真是IP是可以的,但是当服务器是多网卡的情况下,就只能用INADDR_ANY来进行监听了,但是这样就发生了我的问题。
clirus 2015-07-29
  • 打赏
  • 举报
回复
引用 5 楼 xmt1139057136 的回复:
哪个端口是你自己的,你在监听哪个端口??? TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。
我开的端口是9990 就是红色高亮那个,我自己写一个简单的main.c的demo,gcc编译,然后查看,监听地址是0.0.0.0.但是我搞得稍微复杂一点,封装了网络库,然后写了调用demo,就会出现监听地址是127.0.0.1的问题,这种情况下,远程发送连接服务器会返回RST ACK的,因为服务器没有在对应的地址上监听,TCP握手不会成功。 现在我在查为何简单的服务器代码在两种使用方式上发生了这样的问题。 不知道楼主有没有遇到对应的情况
clirus 2015-07-29
  • 打赏
  • 举报
回复
谢谢!问题搞定了
业余草 2015-07-29
  • 打赏
  • 举报
回复
多网卡,就会有多个mac,多个mac就会有多个ip。监听一个具体的ip试试 我不懂c和底层。我只懂部分java
业余草 2015-07-28
  • 打赏
  • 举报
回复
哪个端口是你自己的,你在监听哪个端口??? TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。
chmuggmwtg 2015-07-28
  • 打赏
  • 举报
回复
我查了下书 RST:“基准连接”出现错误,发RST 基准连接指目的IP与端口,源IP与端口。 个人理解:服务器用回环Ip地址与客户端连接的ip地址不一样,导致了。 疑问:服务端都用真实IP,应该也可以测试吧?
clirus 2015-07-27
  • 打赏
  • 举报
回复
引用 3 楼 xmt1139057136 的回复:
0.0.0.0表示监听全网地址
对啊,INADDR_ANY 本来应该是 0.0.0.0 的,我又尝试了几个程序都是ok的
业余草 2015-07-27
  • 打赏
  • 举报
回复
0.0.0.0表示监听全网地址
clirus 2015-07-27
  • 打赏
  • 举报
回复
再顶一把
clirus 2015-07-27
  • 打赏
  • 举报
回复
先自己顶一顶

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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