C语言 网络编程(六)字节序

简介: 本文介绍了在不同操作系统中查看IP地址和网络状态的方法,包括Windows下的`ipconfig`与Linux下的`ifconfig`命令,并详细解析了网络字节序转换函数。通过`inet_aton()`和`inet_addr()`可将IP字符串转换为网络字节序,而`inet_ntoa()`则实现相反操作。此外,还提供了`htons()`与`ntohs()`等函数进行主机字节序与网络字节序之间的转换,并附带示例代码帮助理解。

网络(六)字节序

查看 ip 地址

windows 系统:   

        ipconfig
        ipconfig/all

linux系统:   

        ifconfig

查看⽹络状态:

netstat : 查看当前⽹络服务和端⼝情况
参数:
        -a  (all) 显示所有选项,默认不显示LISTEN相关
        -t  (tcp)仅显tcp相关选项
        -u  (udp)仅显示udp相关选项
        -n 拒绝显示别名,能显示数字的全部转化成数字。
        -l 仅列出有在 Listen (监听) 的服务状态

字节序转换函数

IP字符串转换为网络字节序

方法一:inet_aton()

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

typedef unsigned int  uint32_t;
typedef unsigned int in_addr_t;

in_addr_t inet_addr(const char *cp);

功能:将cp指向的IP字符串转成⽹络字节序

返回值:

成功返回⽹络字节序,失败返回INADDR_NONE [0xffffffff]

注意:它不能识别255.255.255.255,因为它是一个特殊的IP地址。

方法二:inet_aton()

#include <netinet/in.h>

struct in_addr
{
   
    unsigned int s_addr;
};

int inet_aton(const char *cp, struct in_addr *inp);     [addr to network]
功能:    将cp指向的IP字符串转成⽹络字节inp保存的地址中。

参数:
        @cp  IP字符串⾸地址
        @inp 存放⽹络字节序的地址
返回值:

        成功返回⾮0,失败返回0

实质: 存储在inp结构体指针中的 s_addr这个变量中。

示例

// todo 转换⽹络字节序
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

void  ip_convert_first(char *ip);
void  ip_convert_second(char *ip);

int main(int argc, char const *argv[]){
   
    if(argc!= 2){
   
        printf("Usage: %s <IP address>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    ip_convert_first(argv[1]);
    ip_convert_second(argv[1]);


    return 0;
}

void  ip_convert_first(char *ip){
   
    in_addr_t addr;//unsigned int
    addr = inet_addr(ip);
    if(addr == INADDR_NONE){
   //!  255.255.255.255 会报错 INADDR_NONE
    printf("源 IP 地址无效: %s\n", ip);
    exit(EXIT_FAILURE);
}

    printf("源 IP 地址: %s\n", ip);
    printf("网络字节序: %u\n", ntohl(addr));//? %u是无符号整型 ntohl()函数功能是将网络字节序转换为主机字节序
    printf("16进制表示: %#x\n", addr);
}

void  ip_convert_second(char *ip){
   
    struct in_addr addr;
    int ret;
    //@param ip 字符串形式的IP地址
    // @param in_addr 结构体变量,用于存储IP地址
    ret=inet_aton(ip, &addr); // 成功返回⾮0,失败返回0
    if(ret == 0){
   
        printf("源 IP 地址无效: %s\n", ip);
        exit(EXIT_FAILURE);
    }


    printf("源 IP 地址: %s\n", ip);
    printf("网络字节序: %u\n", ntohl(addr.s_addr));//? %u是无符号整型 ntohl()函数功能是将网络字节序转换为主机字节序
    printf("16进制表示: %#x\n", addr.s_addr);

}

网络字节序转换为IP字符串


char *inet_ntoa(struct in_addr in);   [network to addr]

功能:将IP⽹络字节序转换成IP字符串

参数:

    @in   IP⽹络字节序

返回值:

    成功返回IP字符串⾸地址,失败返回NULL

示例

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

// todo 将IP⽹络字节序转换成IP字符串
//源 IP 地址: 192.168.0.88
//网络字节序: 3232235608
//16进制表示: 0x5800a8c0
int main() {
   


    struct in_addr addr;
    addr.s_addr = 0x5800a8c0;
    // 将网络字节序转换成IP字符串
    //@param addr: 网络字节序
    //@return: IP字符串
    char *ip_str = inet_ntoa(addr);
    printf("IP address: %s\n", ip_str);

    return 0;
}

主机字节序转换为网络字节序


short htons(short data); //16位  htonl()是 32位       [host  to network short ]
    功能:将主机字节序转成⽹络字节序
    参数:
        @data 序号转换的整数
    返回值:得到的⽹络字节序


uint32_t ntohs(uint32_t netlong);  16ntohl()32[network to host short]
    功能:把⽹络字节序转换为主机字节序
    参数:
    @   netlong⽹络字节序
    返回值: 返回对应的主机端⼝

示例

// todo ⽹络字节序和主机字节序 转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//源 IP 地址: 192.168.0.88
//主机字节序: 3232235608
//16进制表示: 0x5800a8c0
int main() {
   
//将主机字节序转换为网络字节序
uint16_t port= htons(8000);
printf("IP address: %#x\n", port);


//将网络字节序转换为主机字节序
uint16_t port2 = ntohs(port);
printf("IP address: %d\n", port2);
//将主机字节序转换为网络字节序
uint16_t port3= htonl(3232235608);
printf("IP address: %#x\n", port3);//0xa8c0

//将网络字节序转换为主机字节序
uint16_t port4 = ntohl(0x5800a8c0);
printf("IP address: %d\n", port4); //88
return 0;
}
相关文章
|
21天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
34 2
|
26天前
|
存储 网络协议 物联网
C 语言物联网开发之网络通信与数据传输难题
本文探讨了C语言在物联网开发中遇到的网络通信与数据传输挑战,分析了常见问题并提出了优化策略,旨在提高数据传输效率和系统稳定性。
|
3月前
|
网络协议 Unix C语言
C语言 网络编程(十六)广播和组播
广播和组播是网络通信的重要方式。广播允许一台主机向子网内所有主机发送数据包,常用于局域网内的消息传播;组播则将数据包发送给特定的一组主机,适用于视频会议等应用场景。广播地址如 `192.168.1.255` 用于同一子网的所有主机。组播地址如 `224.0.0.0` 至 `239.255.255.255` 标识特定主机群。C语言示例展示了如何通过 UDP 实现广播和组播通信。此外,UNIX域套接字用于同一机器上进程间的高效通信。
187 14
|
3月前
|
网络协议 算法 网络性能优化
C语言 网络编程(十五)套接字选项设置
`setsockopt()`函数用于设置套接字选项,如重复使用地址(`SO_REUSEADDR`)、端口(`SO_REUSEPORT`)及超时时间(`SO_RCVTIMEO`)。其参数包括套接字描述符、协议级别、选项名称、选项值及其长度。成功返回0,失败返回-1并设置`errno`。示例展示了如何创建TCP服务器并设置相关选项。配套的`getsockopt()`函数用于获取这些选项的值。
|
3月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
3月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
3月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
3月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
3月前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
3月前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。
下一篇
DataWorks