socket函数手册_第1页
socket函数手册_第2页
socket函数手册_第3页
socket函数手册_第4页
socket函数手册_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

socket函数手册 字节序函数#include /* 主机序转换为网络序(short类型) */uint16_t htons (uint16_t host16bitvalue);/* 主机序转换为网络序(long类型) */uint32_t htonl (uint32_t host32bitvalue);/* 网络序转换为主机序(short类型) */uint16_t ntohs (uint16_t net16bitvalue); /* 网络序转换为主机序(long类型) */uint32_t ntohl (uint32_t net32bitvalue);字节操纵函数#include /* 清零 */void bzero (void *dest, size_t nbytes);/* 拷贝 */void bcopy (const void *src, void *dest, size_t nbytes);/* 比较 */int bcmp (const void *ptr1, const void *ptr2, size_t nbytes);IPv4地址转换函数#include /* 字符串(x.x.x.x)转为32位网络序数值* 返回:成功 - 1, 失败 - 0*/int inet_aton (const char *strptr, struct in_addr *addrptr);/* 字符串(x.x.x.x)转为32位网络序数值* 返回:成功 - 32位网络序数值,失败 - INADDR_NONE(0xffffffff)* 注意:255.255.255.255地址无法转换,不推荐使用*/in_addr_t inet_addr (const char *strptr);/* 32位网络序数值转为字符串(x.x.x.x)* 返回:字符串(x.x.x.x)* 注意:返回的字符串保存在静态内存中,此函数不可重入*/char* inet_ntoa (struct in_addr inaddr);IPv4、IPv6 通用地址转换函数#include /* 地址字符串转为数值* 参数:family - AF_INET; AF_INET6,addrptr - sockaddr_in结构体的sin_addr的地址或sockaddr_in6结构体的sin6_addr的地址* 返回:成功 - 1,失败 - -1,输入不是有效的地址 - 0*/int inet_pton (int family, const char *strptr, void *addrptr);/* 数值转为地址字符串* 参数:family - AF_INET或AF_INET6,addrptr - sockaddr_in结构体的sin_addr的地址或sockaddr_in6结构体的sin6_addr的地址strptr - 保存转换后的地址字符串,指针不能为空,并不小于len指定的长度len - 字符串长度,中定义INET_ADDRSTRLEN(16)或INET6_ADDRSTRLEN(48)* 返回:成功 - 返回strptr,失败 - NULL*/const char* inet_ntop (int family, const void *addrptr, char *strptr, size_t len);TCP套接口函数#include /* 创建socket套接口,指定套接口协议类型* 参数:family - AF_UNIX(Unix域),AF_LOCOL(Unix域的POSIX名称),AF_INET(IPv4),AF_INET6(IPv6),AF_ROUTE(路由套接口),AF_KEY(密钥套接口),AF_PACKETtype - SOCK_STREAM(字节流),SOCK_DGRAM(数据报),SOCK_RAW(原始IPv4、IPv6),SOCK_PACKET(LINUX 上类似BPF(BSD分组过滤器,Berkeley内核,如FreeBSD)和DLPI(数据链路提供者接口,SVR4内核,如soloris)的直接访问底层数据链路的套接口类型),SOCK_RDM(可靠传递消息),SOCK_SEQPACKET(有序分组)protocol - 0为给定family和type组合的系统默认值返回:成功 - 套接口描述字,失败 - -1*/int socket (int family, int type, int protocol);/* TCP客户端与TCP服务器建立连接,调用此函数会触发TCP的三次握手,并建立连接。调用此函数前,不必调用bind函数,内核会决定源IP并选择一个临时端口作为源端口。* 参数:sockfd - 套接口描述字servaddr - 包含要连接的服务器的IP和端口号的套接口地址结构addrlen - servaddr套接口地址结构体的大小返回:成功 - 0,失败 - -1*/int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);/* 将一个本地协议地址赋给套接口参数:sockfd - 套接口描述字myaddr - 绑定的本地协议地址,对于网际协议,即IP地址和端口,如果IP地址赋值为INADDR_ANY(通配地址wildcard),则由内核去选择IP地址,如果端口赋值为0,则由内核选择一个临时端口addrlen - 地址结构体的大小返回:成功 - 0,失败 - -1*/int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); /* 指示内核接受一个未连接的套接口上的连接请求* 参数:sockfd - 套接口描述字backlog - 套接口两个队列(完成连接和未完成连接)的排队最大连接个数,各个操作系统有不同的根据backlog计算排队最大连接个数的算法返回:成功 - 0, 失败 - -1*/int listen (int sockfd, int backlog);/* 从已完成连接队列对头返回一个已完成连接,如果已完成连接队列为空,那么进程被阻塞(假设套接口为缺省的阻塞方式)* 参数:sockfd - 监听套接口描述字cliaddr - 输出参数,返回已连接的客户端的协议地址,为NULL,则不返回addrlen - 输出参数,返回套接口地址结构体的大小,为NULL,则不返回返回:成功 - 已连接套接口描述字(由内核自动生成的一个新描述字,代表与所返回客户端的TCP连接)失败 - -1, EINTER - 收到中断*/int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);#include /* 关闭套接口,并终止TCP连接,如果为并发服务器父进程关闭已连接套接口,会将相应描述字的引用计数减一,如果计数不为0,将不会发送FIN参数:sockfd - 套接口描述字返回:成功 - 0, 失败 - -1*/int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。通过测试发现,异步socket的send函数在网络刚刚断开时还能发送返回相应的字节数,同时使用select检测也是可写的,但是过几秒钟之后,再send就会出错了,返回-1。select也不能检测出可写了。int recv( SOCKET s, char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。int close (int sockfd);获得与套接口关联的协议地址#include /* 获得与套接口关联的本地协议地址* 参数:sockfd - 套接口描述字localaddr - 输出参数,返回与套接口关联的本地协议地址addrlen - 输出参数,返回套接字地址结构体的大小*返回:成功 - 0, 失败 - -1*/int getsockname (int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);/* 获得与套接口关联的远端协议地址* 参数:sockfd - 套接口描述字peeraddr - 输出参数,返回与套接口关联的远端协议地址addrlen - 输出参数,返回套接字地址结构体的大小*返回:成功 - 0, 失败 - -1*/int getpeername (int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);I/O 复用函数#include #include /* 检查是否收到关心的套接字事件* 参数:maxfdp1 - 关心的最大套接字 + 1readset - 关心是否可读的套接字的集合,NULL代表不关心writeset - 关心是否可写的套接字的集合,NULL代表不关心exceptset - 关心是否有异常的套接字的集合,NULL代表不关心timeout - NULL:永远等下去;秒数和毫秒数都为0:不等待;指定值:等待一段时间* 返回:成功 - 就绪套接字的数目,超时 - 0,失败 - -1*/int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);/* 用来设置关心套接字集合的函数 */void FD_ZERO(fd_set *fdset);void FD_SET(int fd, fd_set *fdset);void FD_CLR(int fd, fd_set *fdset);int FD_ISSET(int fd, fd_set *fdset);发送FIN函数#include /* 发送FIN,关闭连接* 参数:sockfd - 要关闭连接的socket描述字howto - 关闭连接方式:SHUT_RD - 关闭连接的读这一半,不再接收数据,丢弃接收缓冲区中的未接收数据;SHUT_WR - 关闭连接的写这一半,即半关闭状态,发送缓冲区中将被发送完;SHUT_RDWR - 连接的读写都被关闭* 返回:成功 - 0,失败 - -1*/int shutdown(int sockfd, int howto);套接口选项函数注:标志表明了该选项是否为启用或禁止类型,0 - 禁止,非0 - 启用 级别选项名getset说明标志数据类型SOL_SOCKETSO_BROADCAST*开启或禁止进程发送广播消息的能力,只适用于UDP套接口,如果目的地址为一个广播地址且本套接口选项没有设置,则返回EACCES错误*intSO_DEBUG*只适用于TCP套接口,对套接口发送和接受的报文保留详细跟踪信息,可使用trpt程序进行查看*intSO_DONTROUTE*对发出的报文不查询路由表,直接通过目的地址的网络地址确定本地接口后发送,如果无法由目的地址确定(即不在一个点到点链路或共享网络),则返回ENETUNREACH错误*intSO_ERROR*当socket发生错误时,可以同访问SO_ERROR套接口选项获取该错误值(保存在so_error中),读取后so_error被复位为0,该错误被称为待处理错误(pending error)intSO_KEEPALIVE*适用于TCP套接口,启用或禁止2小时内未收到任一方向上的数据则发送保活探测报文*intSO_LINGER*指定close函数对面向连接协议(如TCP和SCTP)如何操作,缺省操作是close函数立即返回,如果发送缓冲区有数据,则尝试发送给对端。SO_LINGER选项可以改变此设置。如果l_onoff为0,使用缺省设置。如果l_onoff为非0且l_linger为0,则丢弃发送缓冲区中的数据并发送一个RST给对端,没有通常的四次握手终止连接如果l_onoff为非0且l_linger为非0,则当套接口关闭时内核将拖延一段时间,如果发送缓冲区有数据,进程将被阻塞,知道所有数据发送玩且均被对方确认或延滞时间到。如果套接口为非阻塞型,那么它将不等待close完成,即使l_linger为非0。sturct linger int l_onoff; int l_linger; SO_OOBINLINE*开启时,带外数据将被留在正常的输入队列中。这种情况下接收函数的MSG_OOB标志不能用来读带外数据。*intSO_RCVBUF*改变接收缓冲区的缺省大小,对于TCP客户端的接受缓冲区大小必须在调用connect之前设置;对于TCP服务器端必须在调用listen之前给套接口设置,新建的已连接套接口从监听套接口继承缓冲区大小。TCP缓冲区大小至少应是相应连接的MSS值的四倍,且为MSS值的偶数倍。intSO_SNDBUF*改变发送缓冲区的缺省大小,同上intSO_RCVLOWAT*改变接收低潮标记,即select返回套接口接收缓冲区可读所需的数据量,对于TCP、UDP、SCTP套接口,缺省为1 intSO_SNDLOWAT*改变发送低潮标记,即select返回套接口发送缓冲区可写所需的可用空间intSO_RCVTIMEO*改变套接口接收的超时值,时间为0代表不超时struct timevalSO_SNDTIMEO*改变套接口发送的超时值,时间为0代表不超时struct timevalSO_REUSEADDR*允许启动一个监听服务器并捆绑众所周知端口,即使以前在此端口上建立的连接仍存在;允许完全重复的捆绑:即当一个IP地址和端口已绑定到某个套接口上时,如果传输协议支持,同样的IP和端口还可以捆绑到另一个套接口上,一般来说仅支持UDP套接口。*intSO_REUSEPORT*允许完全重复的捆绑(如上详述),不过只有在想要捆绑同一IP地址和端口的每一个套接口都启用本选项才行;如果被捆绑的IP地址是一个多播地址,那么SO_REUSEADDR和SO_REUSEPORT被认为等效*intSO_TYPE*获得套接口的类型,如SOCK_STREAM或SOCK_DGRAMintSO_USELOOPBACK*只适用于路由域套接口,开启时,相应套接口将接收在其上发送的任何数据报的一份拷贝*int#include /* 获得套接口选项* 参数: sockfd - 套接字,level - 级别,optname - 选项名,optval - 值,optlen - 值的大小* 返回: 0 - 成功,-1 - 失败*/int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);/* 设置套接口选项* 参数: sockfd - 套接字,level - 级别,optname - 选项名,optval - 值,optlen - 值的大小* 返回: 0 - 成功,-1 - 失败*/int setsockopt(int sockfd, int level

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论