相关函数列表
//创建一个套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol); //套接字是双向的,采用下面函数来禁止一个套接字的I/O #include <sys/socket.h> int shutdown(int sockfd, int how); //大端和小端,有4个用来在处理器字节序和网络字节序之间实施转换的函数 #include <arpa/inet.h> uint32_t htonl(uint32_t hostinet32); uint16_t htons(uint16_t hostint16); uint32_t ntohl(uint32_t netint32); uint16_t ntohs(uint16_t netint16); //地址格式的结构体 struct sockaddr { sa_family_t sa_faily; char sa_data[]; }; //IPv4因特网(AF_INET)中,套接字地址用结构体sockaddr_in表示 struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; }; //in_addr结构体 struct in_addr { in_addr_t s_addr; }; //下面函数用于将二进制地址格式和点分十进制字符表示之间转换 #include <arpa/inet.h> const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size); int inet_pton(int domain, const char *restrict str, void *restrict addr); //通过下面函数可以找到给定计算机系统的主机信息 #include <netdb.h> struct hostent *gethostent(void); void sethostent(int stayopen); void endhostent(void); //hostent结构体 struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; //能够采用一套相似的接口来获得网络名字和网络编号 #include <netdb.h> struct netent *getnetbyaddr(uint32_t net, int type); struct netent *getnetbyname(const char *name); struct netent *getnetent(void); void setnetent(int stayopen); void endnetent(void); //netent结构体至少包含如下内容 struct netent { char *n_name; char **n_aliases; int n_addrtype; uint32_t n_net; }; //可以用下面函数在协议名字和协议编号之间进行映射 #include <netdb.h> struct protoent *getprotobyname(const char *name); struct protoent *getprotobynumber(int proto); struct protoent *getprotoent(void); void setprotoent(int stayopen); void endprotoent(void); //protoent结构体至少包含如下 struct protoent { char *p_name; char **p_aliases; int p_ptoro; }; //服务是由地址的端口号部分表示的,可以使用getservbyname将一个服务名映射到一个端口号,下面 //函数将一个端口号映射到一个服务名,并可以扫描查询 #include <netdb.h> struct servent *getservbyname(const char *name, const char *proto); struct servent *getservbyport(int port, const char *proto); struct servent *getservent(void); void serservent(int stayopen); void endservent(void); //servent结构体至少包含如下 struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; }; //下面函允许将一个主机名和一个服务名映射到一个地址 #include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *restrict host, const char *restrict service, const struct addrinfo *restrict buf, struct addrinfo **restrict res); void freeaddrinfo(struct addrinfo *ai); //addrinfo结构体至少包含以下成员 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; }; //下面函数将错误码转成错误消息 #include <netdb.h> const char *gai_strerror(int error); //将一个地址转换成一个主机名和一个服务名 #include <sys/socket.h> #include <netdb.h> int getnameinfo(const struct sockaddr *restrict addr, socklen_t alen, char *restrict host, socklen_t hostlen, char *restrict service, socklen_t servlen, int flag); //下面函数用来关联地址和套接字 #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t len); //下面函数用来发现绑定到套接字上的地址 #include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp); //如果套接字已经和对等方连接,下面函数用来找到对方的地址 #include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp); //使用下面函数来建立连接 #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t len); //服务器调用下面函数来宣告它愿意接受连接请求 #include <sys/socket.h> int listen(int sockfd, int backlog); //一旦服务器调用listen,所用的套接字就能接收连接请求,下面函数获得连接请求并建立连接 #include <sys/socket.h> int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len); //用来发送数据的函数 #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags); ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen); ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); //msghdr结构体至少包含如下 struct msghdr { void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iovlen; void *msg_control; socklen_t msg_controllen; int msg_flags; }; //用来接收数据的函数 #include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); //套接字选项 #include <sys/socket.h> int setsockop(int sockfd, int level, int option, const void *val, socklen_t len); int getsockop(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp); //TCP支持紧急标记(urgent mark),为帮助判断是否已经达到紧急标记,可以使用下面函数 #includ <sys/socket.h> int sockatmark(int sockfd);