socket可以看成是用户进程与内核网络协议栈的编程接口。
socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。
IPV4套接口地址结构
通用地址结构
网络字节序
如何查看自己机器上的字节序是大端字节序还是小端字节序
int main()
{
unsigned int x = 0x12345678;
unsigned char *p = (unsigned char*)&x;
printf("%x %x %x %x\n",p[0],p[1],p[2],p[3]);
return 0;
}
执行结果:
这是小端字节序。
字节序转换函数
实现一个主机字节序转换成网络字节序:
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
unsigned int x = 0x12345678;
unsigned char *p = (unsigned char*)&x;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int y = htonl(x);
p = (unsigned char *)&y;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
return 0;
}
结果:
从小端字节序转换成大端字节序。其中就一行代码搞定:
unsigned int y = htonl(x);
就是实现主机字节序转换成网络字节序。
地址转换函数
将点分十进制ip地址转换成32位的整数主机字节序打印出来;
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
unsigned long addr = inet_addr("192.168.0.100");
printf("addr=%u\n",ntohl(addr));
return 0;
}
结果:
这行代码的意思就是将点分十进制的IP地址转换成无符号的32位整数。
unsigned long addr = inet_addr("192.168.0.100");
这个函数是讲地址结构转换成点分十进制的IP地址
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
unsigned long addr = inet_addr("192.168.0.100");
printf("addr=%u\n",ntohl(addr));
struct in_addr ipaddr;//定义一个地址结构
ipaddr.s_addr = addr; //把上面已经转换好的ip地址赋值给地址结构中的地址
printf("%s\n",inet_ntoa(ipaddr));//打印输出点分十进制IP地址
return 0;
}
结果:
这个函数和
这个函数的意义一样的。
也是把点分十进制转换成网络字节序地址,后面的参数是输出参数。