目录
在同一台主机或设备上,可能有多个进程同时在使用tcp或udp协议,端口号的作用就是区分这些不同的进程,即每个进程使用各自不同的端口号。
对于tcp协议和udp协议,端口号都是用unsigned short类型表示,即端口号的范围为0-65535,这65536个端口号被分为3段:
well-known端口在unix系统中称为保留端口,使用保留端口的服务器程序,必须以root用户启动运行。
tcp套接字对是定义tcp连接两个端点的四元组,包括:本地ip地址、本地端口号、对端ip地址、对端端口号,每个端点的ip地址和端口号通常称为一个套接字。
tcp套接字对可用于唯一标识一个网络中的tcp连接。
大多数套接字api都需要一个指向套接字地址结构的指针作为函数参数,每个协议族都定义它自己的套接字地址结构,这些结构的名字均以sockaddr_开头,并以对应每个协议族的唯一后缀结尾。
ipv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in
命名,定义在<netinet/in.h>
头文件中。
#include <netinet/in.h> struct in_addr { in_addr_t s_addr; //32-bit ipv4 address, network byte ordered }; struct sockaddr_in { uint8_t sin_len; //length of structure sa_family_t sin_family; //af_inet in_port_t sin_port; //16-bit tcp or udp port number, network byte ordered struct in_addr sin_addr; //ipv4 address structure char sin_zero[8]; //unused };
通用套接字地址结构struct sockaddr
定义在<sys/socket.h>
头文件中。
#include <sys/socket.h> struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[4]; };
对于应用程序开发人员来说,通用套接字地址结构的唯一用途就是:将特定协议的套接字地址结构指针强制类型转换为通用套接字地址结构指针,并传递给套接字api。
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
#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);
上面4个字节排序函数只适用于整数类型,因此在套接字编程中:
地址转换函数用于在ip地址的字符串格式和网络字节序格式之间进行转换。
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> /* * 字符串——>网络字节序; * 成功返回网络字节序ipv4地址,失败返回inaddr_none; */ in_addr_t inet_addr(const char *str); /* * 字符串——>网络字节序,并通过addr指针保存; * 若字符串有效则成功返回1,否则失败返回0. */ int inet_aton(const char *str, struct in_addr *addr); /* * 网络字节序——>字符串; * 返回字符串格式的ipv4地址. */ char *inet_ntoa(struct in_addr addr);
上面三个函数有两点需要注意:
如对本文有疑问, 点击进行留言回复!!
linux下文本编辑器vim的使用方法(复制、粘贴、替换、行号、撤销、多文件操作)
网友评论