TCP IP地址和端口号设置

1.大小端模式

1. 大端模式:低地址存储高字节
    小端模式:低地址存储低字节

2.网络传输统一使用大端模式作为网络字节序,而计算机大多数为小端模式

3.大小端转化函
(1)头文件     #include <arpa/inet.h>
(2)函数 
        uint32_t htonl(uint32_t hostlong);       //主机字节序转化为网络字节序 long 类型

        uint16_t htons(uint16_t hostshort);    //主机字节序转化为网络字节序short类型

        uint32_t ntohl(uint32_t netlong);        //网络字节序转化为主机字节序 long 类型

        uint16_t ntohs(uint16_t netshort);        //网络字节序转化为主机字节序short类型

2.地址转化函数 

        一般我们所用的如192.168.10.3这类IP地址是点分式十进制,在网络传输时需要转化为32位无符号整数
点分式10进制转化32位无符号整数函数
 (1)头文件 #include <arpa/inet.h>
 (2)int inet_pton(int af, const char *src, void *dst);
      功能:将一个点分式10进制 IP字串转化为一个 32位无符号整数 
      参数: 
          af  协议族   AF_INET : IPV4      AF_INET6 :IPV6 ...
          src: 表示一个不可以修改的字符串 即点分式十进制数串 
          dst:    是一个地址 这个地址用于存储32位无符号的整数 
     返回值: 成功返回 1  失败返回 -1 错误码填充再 errno中         
     注意:最后出来的存储 内容并不是小端存储 而是 以网络字节序存储 

32位无符号整数转化点分式10进制函数   
  (1)头文件 #include <arpa/inet.h>
  (2) const char *inet_ntop(int af, const void *src,  char *dst, socklen_t size);
    功能:将一个32位的无符号整数IP地址 转化位 十进制点分式IP地址 
    参数: 
        af 即协议族,同上
        src 存储32位数据的地址 
        dst 即存储点分式字符串的首地址 
        len     即缓冲区的长度定义的 因为 IPV4 和 IPV6的协议地址长度是不同 
            定义了两个宏 
                #define INET_ADDRSTRLEN 16      缓冲区长度占16个字节 
                #define INET6_ADDRSTRLEN 46 
    返回值:成功返回 存储的首地址   失败返回 NULL

3.存储IP地址端口的结构体

        下面两个结构体可存储绑定socket的IP地址和端口号,一般使用第二个

1.struct sockaddr {
                sa_family_t sa_family; //指的是协议族 即你的地址结构体中需要协议族这个内容 
                char        sa_data[14]; //存储地址和端口号等信息的 
            }

2.头文件:#include <netinet/in.h >

struct sockaddr_in {
                sa_family_t sin_family;   //协议族        AF_INET : IPV4      AF_INET6 :IPV6 ...
                in_port_t sin_port;          // 端口号 
                struct in_addr sin_addr;  // IP地址 
            };

struct in_addr{
                u32_i s_addr; //无符号的32位数据 表示 32位的地址 
            }

ps:以上的结构体中存储的数据必须是网络字节序 

4.举例

        因此,一般绑定socket的地址设定如下

    struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(88);//88端口号
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //127.0.0.1 IP地址

5.端口号

       端口号说明

6.INADDR_ANY

        我们有时会遇到addrServer.sin_addr.s_addr = htonl(INADDR_ANY)这种定义,那么INADDR_ANY代表什么意思呢?

         INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。

比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?

如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐?

所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查看应用是否绑定了正确的IP地址端口号,可以通过以下方式进行: 1. 查看应用的配置文件:应用的配置文件通常会包含应用绑定的IP地址端口号信息,可以查看配置文件中的相应配置项是否正确配置。例如,对于Java Web应用来说,可以查看Tomcat、Jetty等Web容器的server.xml配置文件,确认Connector元素中的address和port属性的值是否正确配置。 2. 使用命令查看应用的监听端口:在Linux或Unix系统中,可以使用netstat命令查看应用的监听端口是否正确。例如,执行以下命令: ``` netstat -anp | grep LISTEN | grep <应用进程的PID> ``` 其中<应用进程的PID>指的是应用所在进程的PID,可以通过ps命令查看。如果应用绑定的IP地址端口号正确,会显示类似以下的信息: ``` tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN <应用进程的PID>/<应用进程的名称> ``` 其中0.0.0.0:80表示应用绑定的IP地址端口号,<应用进程的PID>/<应用进程的名称>表示应用所在进程的PID和名称。 3. 使用telnet命令测试连接:使用telnet命令测试应用的IP地址端口号是否正确,如果连接成功,则说明应用绑定的IP地址端口号是正确的。例如,执行以下命令: ``` telnet <应用IP地址> <应用端口号> ``` 其中<应用IP地址>和<应用端口号>分别指应用绑定的IP地址端口号。如果连接成功,则说明应用绑定的IP地址端口号是正确的。 通过以上方式,可以较为准确地判断应用是否绑定了正确的IP地址端口号。如果仍然无法解决问题,建议进一步查看应用的日志文件,或者咨询应用的开发者进行排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值