linux之socket系列函数
结构体
struct sockaddr_in结构类型是用来保存socket的信息 struct sockaddr_in { short int sin_family; //地址家族,一般来说 AF_INET(地址族)PF_INET(协议族 ) unsigned short int sin_port; //端口号 struct in_addr sin_addr; //网络地址 unsigned char sin_zero[8]; //没有实际意义,只是为了跟SOCKADDR结构在内存中对齐 };
struct hostent结构类型是用来保存主机的信息 struct hostent{ char *h_name; //主机的规范名 char **h_aliases; //主机的别名 int h_addrtype; //主机ip地址的类型:AF_INET或者AF_INET6 int h_length; //主机ip地址的长度 char **h_addr_list; //主机的ip地址,以网络字节序存储。 #define h_addr h_addr_list[0] };
struct iovec{ void *iov_base; //指向一个缓冲区,这个缓冲区是存放接收的数据或是将要发送的数据 size_t iov_len; //接收数据的最大长度以及实际写入数据的长度 };
struct msghdr{ void *msg_name; //主机ip地址 socklen_t msg_namelen; //主机ip地址的长度 struct iovec *msg_iov; //缓冲区 int msg_iovlen; //缓冲区的长度 void *msg_control; //附属数据缓冲区 socklen_t msg_controllen; //附属数据缓冲区大小 int msg_flags; //信息标记位
socket函数
1、建立socket
调用成功,返回socket文件描述符;失败,返回-1,并设置errno
int socket(int domain, int type, int protocol); domain: //指明所使用的协议族,通常为PF_INET,表示TCP/IP协议; type: //指定socket的类型,基本上有三种:数据流套接字(SOCK_STREAM)、 //数据报套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW) protocol: //通常赋值0。
2、bind函数
将套接字和指定的端口相连。成功返回0,否则,返回-1,并置errno.
int bind(int sock_fd,struct sockaddr_in *my_addr, int addrlen); sock_fd: //调用socket函数返回值, my_addr: //是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针; addrlen: //sockaddr的长度
3、connect函数
需要头文件:sys/types.h、sys/socket.h客户端发送服务请求。调用成功返回0,否则,返回-1,并置errno.
int connect(int sock_fd, struct sockaddr *serv_addr,int addrlen); serv_addr: //服务器ip地址和端口号 addrlen: //结构sockaddr_in的长度。
4、listen函数
需要头文件:sys/socket.h等待指定的端口的出现客户端连接。调用成功返回0,否则,返回-1,并置errno.
int listen(int sock_fd, int backlog); backlog: //指定在请求队列中允许的最大请求数
5、accecpt函数
需要头文件:sys/socket.h接受客户端的服务请求,成功返回新的套接字描述符,失败返回-1,并置errno
int accept(int sock_fd, struct sockadd_in* addr, int addrlen);
6、关闭连接函数
close(sockfd); 需要头文件:unistd.h int shutdown(int sockfd,int how); 需要头文件:sys/socket.hhow允许为shutdown操作选择以下几种方式:
0-------不允许继续接收数据
1-------不允许继续发送数据
2-------不允许继续发送和接收数据
数据传输函数
1、write/read函数
write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量.Read函数是负责从fd中读取数据到buf内。成功返回实际读取到的字节数,如果返回值是0,表示已经读取到文件的结束了,小于0表示是读取错误。
ssize_t write(int fd,const void *buf,size_t nbytes) ssize_t read(int fd,void *buf,size_t nbyte)
2、send/recv函数
int send(int sockfd, const void *buf, int len, unsigned int flags); int recv(int sockfd,void *buf,int len,unsigned int flags); buf: //指向要发送数据的指针 len: //以字节为单位的数据的长度 flags: //一般情况下置为0。
3、sendto/recvfrom函数
int sendto(int sockfd,const void *buf,int len,unsigned int flags,const struct sockaddr *to, int tolen); int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen) buf: //指向发送/接受的数据存放的地方。 flags: //一般设0 to/from: //用来指定传送的网络地址 tolen/fromlen: //sockaddr的结构长度。
4、sendmsg/recvmsg函数
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
5、writev/readv函数
ssize_t readv(int filedes,const struct iovec *iov,int iovcnt); ssize_t writev(int filedes,const struct iovec *iov,int iovcnt);
其它函数
1、字节序转换
需要头文件:netinet/in.hunsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes
2、IP地址转换
unsigned long int inet_addr(const char * cp):
将一个用点分十进制表示的IP地址的字符串转换成一个无符号长整型,返回转换结果。如果参数char *cp无效,函数返回-1
转换网络主机地址cp为二进制数值,并存储在struct in_addr结构中,即第二个参数inp。函数返回非0表示cp主机有地有效,返回0表示主机地址无效。
将32位二进制形式的IP地址转换为点分十进制表示的IP地址的字符串,返回转换结果
3、字节处理函数
void bzero(void * s,int n):
将参数s指定的内存的前n个字节设置为0,通常它用来将套接字地址清0。
从参数src指定的内存区域拷贝指定数目的字节内容到参数dest指定的内存区域。
比较参数s1指定的内存区域和参数s2指定的内存区域的前n个字节内容,如果相同则返回0,否则返回非0。
将参数s指定的内存区域的前n个字节设置为参数c的内容。
功能同bcopy(),区别:函数bcopy()能处理参数src和参数dest所指定的区域有重叠的情况,memcpy()则不能。
比较参数s1和参数s2指定区域的前n个字节内容,如果相同则返回0,否则返回非0。
4、其他
gethostname
需要头文件:unistd.h
获取进程所在机器的计算机的名字
int gethostname(char *hostname, size_t size); hostname //是一个字符数组指针,它将在函数返回时保存主机名。 size是hostname //数组的字节长度。 成功时返回 0,失败时返回 -1,并设置 errno。
gethostbyname
需要头文件:netdb.h、sys/socket.h用域名或主机名获取IP地址
struct hostent *gethostbyname(const char *name);
这个函数的传入值是域名或者主机名,例如"www.baidu.com"等等。
成功返回一个hostent的结构,失败返回NULL。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。