linux系统编程-SOCKET通信基础编程(0)-常用数据结构
linux系统编程-SOCKET通信基础编程(1)-TCP客户端创建
linux系统编程-SOCKET通信基础编程(2)-TCP服务端创建
1.网络地址结构体
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx , 2 Byte*/
char sa_data[14]; /* 14 bytes of protocol address 14 Byte*/
};
struct sockaddr_in {
short int sin_family; /* Address family , 2 Byte*/
unsigned short int sin_port; /* Port number , 2Byte 服务器端口*/
struct in_addr sin_addr; /* Internet address , 4 Byte IP地址信息 */
unsigned char sin_zero[8]; /* Same size as struct sockaddr , 8 Byte*/
};
struct in_addr {
unsigned long s_addr; //4 Byte
};
1.1使用简介
socklen_t addrlen=0;
int server_sock = setup_socket();
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
addrlen = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &addrlen);
(char *)inet_ntoa(client_addr.sin_addr.s_addr)//转换客户端IP地址为192.168.1.1这种字符串类型
ntohl(client_addr.sin_port) //获取端口号
/****************************************************************
在编程中大多数是使用sockaddr_in这个结构来设置/获取地址信息。
sin_family指代协议族,在网络通信的socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
*****************************************************************/
struct sockaddr_in sa;
sa.sin_family = AF_INET; // AF_INET TCP协议标识网络通信 AF_UNIX 本地的unix通信,
sa.sin_port = htons(3490); /* short, NBO*/
sa.sin_addr.s_addr = inet_addr("132.241.5.10");
bzero(&(sa.sin_zero), 8);
2.IP地址转换
int inet_aton(const char *cp, struct in_addr *inp); //将cp所指的字符串IP地址转换成32位的网络字节序IP地址
in_addr_t inet_addr(const char *cp); //将cp所指的字符串IP地址转换成32位的网络字节序IP地址返回
char *inet_ntoa(struct in_addr in); //将32位网络字节序IP地址转换成点分十进制的字符串IP地址
3.端口号的使用规则
计算机端口号总数:65535,一般用到的是1~65535,0一般不使用
0-1023: 系统端口,也叫公认端口,这些端口只有系统特许的进程才能使用;
1024~65535 为用户端口:
1024-5000: 临时端口,一般的应用程序使用1024到4999来进行通讯;
5001-65535:服务器(非特权)端口,用来给用户自定义端口。
4.INADDR_ANY
INADDR_ANY就是inet_addr("0.0.0.0");
当服务器的监听地址是INADDR_ANY时含义是让服务器端计算机上的所有网卡的IP地址都可以作为服务器IP地址,也即监听外部客户端程序发送到服务器端所有网卡的网络请求。