@Dubyoo
        
        2017-08-15T03:00:00.000000Z
        字数 1983
        阅读 3778
    Linux网络编程
它是网络进程的ID。网络通信就是(不同计算机)进程间的通信。
套接字是网络地址(IP)和端口号(PORT)的组合可以唯一确定整个网络中的一个网络进程。
TCP/IP协议中端口号范围0~65535。应用程序固定的端口0~1023,用户自定义的通常大于1024 。
socket是一种特殊的I/O接口,它是一种文件描述符。
//socket信息数据结构struct sockaddr{unsigned short sa_family; /*地址族*/char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/};struct sockaddr_in{short int sa_family; /*地址族*/unsigned short int sin_port; /*端口号*/struct in_addr sin_addr; /*IP地址*/unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/};struct in_addr{unsigned long int s_addr; /* 32位IPv4地址,网络字节序 */};
计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。
//举例:存放数据 0x12345678向计算机内存中存放 32bit 数据 ---> 0x 12 34 56 78数据高位 ---> 低位小端存储:低地址 ---> 高地址(低位低地址,高位高地址)| 0x4000 | 0x4001 | 0x4002 | 0x4003 || 0x78 | 0x56 | 0x34 | 0x12 |大端存储:低地址 ---> 高地址(高位低地址,低位高地址)| 0x4000 | 0x4001 | 0x4002 | 0x4003 || 0x12 | 0x34 | 0x56 | 0x78 |网络中传输的数据字节序都是大端模式的#include <netinet/in.h>htons() //传入主机字节序的16位数值,返回网络字节序ntohs() //传入网络字节序的16位数值,返回主机字节序htonl() //传入主机字节序的32位数值,返回网络字节序ntohl() //传入网络字节序的32位数值,返回主机字节序h: host n: network s: short l: long通常16位的端口号用short表示,32位的IP地址用long表示。
/* test.c(测试本机是大端还是小端) */#include <stdio.h>int main(){int a = 0x12345678;char * p ;p = (char*)&a ;if((*p) == 0x78)printf("your computer is small-endian\n") ;else if((*p) == 0x12)printf("your computer is big-endian\n") ;return 0 ;}
// ipv4#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int inet_aton(const char *straddr, struct in_addr *addrptr);/*将点分十进制数的IP地址转换成为网络字节序的32位二进制数值。返回值:成功,则返回1,不成功返回0 。*//*参数straddr:存放输入的点分十进制数IP地址字符串。*//*参数addrptr:传出参数,保存网络字节序的32位二进制数值。*/char * inet_ntoa(struct in_addr inaddr);/*将网络字节序的32位二进制数值转换为点分十进制的IP地址。*/in_addr_t inet_addr(const char *straddr);/*功能同inet_aton(),返回值不同。inet_addr()若成功则返回32位二进制的网络字节序地址。*/
// ipv4 || ipv6#include <arpa/inet.h>int inet_pton(int family, const char *src, void *dst);/*同inet_aton(),family = AF_INET表示是IPv4family = AF_INET6,表示IPv6协议*/const char *inet_ntop(int family, const void *src, char *dst, socklen_t len);/*同inet_ntoa()family同上其中len表示表示转换之后的长度(字符串的长度)。 */