1、socket
1)socket可以看成用户进程与内核协议栈的编程接口。
2)socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。
2、ipv4套接字地址结构
struct sockaddr_in
{
short sin_family;/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/
unsigned short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/
struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/
unsigned char sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/
};
通用的sockt地址结构
struct sockaddr {
sa_family_t sin_family;//地址族
char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息
};
3、字节序
字节序,即字节在内存或者网络传输是的序列。
1)大端字节序
大端字节序:是字节高位存储在内存低位,字节低位存储在内存高位。
2)小端字节序
小端字节序:是字节低位存储在内存的低位,字节高位存储在内存高位。
例如:0X12345678
大端字节序,内存存储格式为:12 34 56 78
小端字节序,内存存储格式为:78 56 34 12
4、测试当前机器是何种字节序程序
unsigned int x = 0X12345678;
unsigned char *p = (unsigned char *)&x;
printf("%x %x %x %x\n", p[0],p[1],p[2],p[3]);
5、字节序相关的转换函数
//htonl, htons, ntohl, ntohs - convert values between host and network byte order
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//说明:上述函数中, h代表host, n代表network, s代表short, l代表long
6、地址转换的函数
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);