作者:2的4次方根God | 来源:互联网 | 2023-06-08 16:41
1、套接字是通信端点的抽象。
int socket(int domain, int type , int protocol);(1 )domain域确定通信的特性,如地址格式,AF=address family AF_INET IPv4因特网域 AF_INET6 IPv4因特网域 AF_UNIX UNIX域 AF_UNSPEC 未指定(2 )type 套接字类型,进一步确定通信特征 SOCK_DGRAM 固定长度数据包,两个进程不需要连接,只需要向其套接字发送一个报文 SOCK_RAM IP协议的数据报接口,之间访问IP层,绕过传输协议,应用自己构造协议头部 SOCK_SEQPACKET 固定长度、有序、面向连接的的报文传递 SOCK_STREAM 字节流,需要建立连接(3 )protocol协议,为0 则根据域和套接字类型自动选择协议 IPPROTO_IP IPv4网际协议 IPPROTP_IP6 IPv6网际协议 IPPROTP_ICMP 因特网控制报文协议 IPPROTP_RAW 原始IP数据包协议 IPPROTP_TCP 传输控制协议 IPPROTP_UDP 用户数据包协议
int shutdown(int sockfd, int how);
2、字节序:印第安序,Intel处理器一般为小端,TCP/IP协议栈使用大端 大端:低地址放高字节,从低地址开始读数 小端:低地址放低字节 进程标志由两部分组成:计算机网络地址;计算机上用端口号表示的服务
uint32_t htonl(uint32_t hostint32) ; uint16_t htons(uint16_t hostint16) ;uint32_t ntohl(uint32_t netint32) ; uint16_t ntohs(uint16_t netint16) ;
3、地址格式 不同格式地址会被强制转换成一个通用的地址结构srtuct sockaddr。Linux中IPv4因特网域中的套接字
struct sockaddr_in{sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;unsigned char sin_zero[8 ]; };struct in_addr{in_addr_t s_addr; };const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size);int inet_pton(int domain, const void *restrict str, void *restrict str);
4、地址查询
struct hostent{char *h_name;char **h_aliases;int h_addrtype;int h_length;char **h_addr_list; }struct netent{char *n_name;char **n_aliases;int n_addrtype;uint32_t n_net; }struct protoent{char *p_name;char **p_aliases;int p_proto; }; 服务是由地址的端口号部分表示的,每个服务由一个唯一的总所周知的端口号支持。struct servent{char *s_name;char **s_aliases;int s_prot;char *s_proto; };struct addrinfo{int ai_flags;int ai_family;int ai_socktype;int ai_protocol;socklen_t ai_addrlen;struct sockaddr *ai_addr;char *ai_canonname;struct addrinfo *ai_next; };int getaddrinfo(const char *restrict host, const char *restrict service, const struct addrinfo *restrict hint, struct addrinfo **restrict res);
5、服务器需要给一个发起请求的接收客户端套接字关联上一个已知的地址(某个名字的服务)。
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);int connect(int sockfd, const struct sockaddr *addr, socklen_t len);int listen(int sockfd, int backlog);int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len); 调用accept,没有请求到达会一直阻塞直到一个请求到达。服务器可以使用poll或select等待一个请求到达。