socket编程(一)

字节序转换函数

为什么要引入网络字节序?

因为socket在不同系统之间通信,他们对于数据的存储是不同的,可能会无法解析数据。所以要统一一个字节序。

头文件:#include<arpa/inet.h>

//h代表host
//n代表network
//s代表short
//l代表long
//例子:ntohl-> 网络字节序转换成主机字节序
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

地址转换函数:

IP地址两种表述方式:

  1. 点分十进制(192.168.0.100)
  2. 32位二进制数 0Xc0a80064(H) = 3232235620d

我们比较直观的IP地址“点分十进制” (192.168.0.100)而不是32位的IP地址。编程的时候是需要32位的地址。所以我们需要引用地址转换函数。

int inet_ato(const char* cp,struct in_addr * inp)

常用的两个:

in_addr_t inet_addr(const char* cp ) //点分十进制转换成32位整数

char *inet_ntoa(struct in_addr in); //32位地址结构转换成点分十进制

 

整体的代码:

#include<stdio.h>
#include<arpa/inet.h> //字节序转换函数
#include<netinet/in.h> //地址转换函数,不仅包含这个头文件还需要包含<aroa/inet.h>头文件
int  main(){
    unsigned int x = 0x12345678;
    unsigned char* p = (unsigned char*)&x;
    unsigned long addr = inet_addr("192.168.1.100");
    printf("0%x_0%x_0%x_0%x\n",p[0],p[1],p[2],p[3]); //%x,%X 读入十六进制整数
    printf("addr=%u\n",ntohl(addr));
    struct in_addr ipaddr;
    ipaddr.s_addr = addr;
    printf("%s\n",inet_ntoa(ipaddr));
    return 0;
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值