SOCKET服务器的问题

请问一下,在服务器上开了一个端口9900,建了一个SOCKET服务器,为什么我的客户端没有向这个服务器端的端口发送数据,它确收到了数据,请帮忙分析一下,这个数据来自哪里

还有一个问题是:

 为什么我这个云服务器,公网IP是  47.104.x.x  为什么直接写在监听端口左侧的IP时,不能用,写本机的172.31.x.x这个地址这个SOCKET服务器也不能正常用,为什么只能写0.0.0.0,时才能正常用。

还有我这个云服务器的公网IP 是  47.104.x.x 为什么不能填写到我的网卡的IP地址设置中?

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/350568
  • 你也可以参考下这篇文章:树莓派手机客户端连接失败问题解决(socket模块,C语言)
  • 除此之外, 这篇博客: 【网络编程】socket、端口、进程的关系中的 2. 内核是如何将数据包转发至 socket 的呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    网络数据首先到达网卡,然后进入内核,由网络协议栈去处理,那么内核是如何进行数据分发的呢?它怎么知道该如何把数据交给特定的用户进程呢?

    这时,就需要 socket 发挥作用了!

    socket 中存储了特定的四元组: 源ip+port,目的ip+port;

    TCP Client :

    1. 源 ip+port ,socket 为 [src ip, src port) <=> (*, *)] ;
    2. Connect 到目的 ip+port,socket 变为 [src ip, src port) <=> (dst ip, dst port)];
    3. 通过 Socket 与 TCP Server 进行通信。

    Client 端,一个连接会占用一个系统端口。

    TCP Server:

    1. Accept 返回的 socket 为 [src ip, src port) <=> (dst ip, dst port)];每一个连接都对应一个 socket id。

    Server 端,所有连接共享同一个端口。

    当系统接收 TCP 网络数据时,根据端口定位到特定的进程,然后进程根据 socket id 区分来自不同 client 的数据。系统中所有 socket 中的四元组信息,必定唯一,不可能重复!

    这里写图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

关于您的第一个问题,服务器端口9900收到数据但客户端并未发送,这可能有以下几种情况:

有其他客户端连接到了这个端口并发送了数据。
服务器程序可能在监听的过程中接收到了其他类型的网络事件,例如TCP连接的建立或断开,这些事件也可能被视为"数据"。
有可能是网络攻击,例如端口扫描或者DDoS攻击。
关于您的第二个问题,云服务器监听地址不能设置为公网IP或者本机地址,只能设置为0.0.0.0,这是因为:

0.0.0.0表示监听所有的网络接口,包括公网和私网。
云服务器的公网IP通常是通过网络地址转换(NAT)实现的,服务器本身并不直接拥有这个IP,所以不能直接监听这个IP。
172.31.x.x是私有地址,可能因为云服务提供商的网络设置,这个地址并不能被公网访问,所以监听这个地址的服务器也不能被公网访问。
关于您的第三个问题,云服务器的公网IP不能填写到网卡的IP地址设置中,这是因为:

云服务器的公网IP通常是通过网络地址转换(NAT)实现的,服务器本身并不直接拥有这个IP,所以不能直接设置这个IP。
云服务提供商通常会管理所有的公网IP,并通过他们的网络设备将公网IP映射到您的云服务器上。您的云服务器只需要设置一个私有IP,然后云服务提供商的网络设备会将公网IP的流量转发到您的私有IP上。