socket函数手册

上传人:日度 文档编号:145970277 上传时间:2020-09-25 格式:DOC 页数:15 大小:87.50KB
返回 下载 相关 举报
socket函数手册_第1页
第1页 / 共15页
socket函数手册_第2页
第2页 / 共15页
socket函数手册_第3页
第3页 / 共15页
socket函数手册_第4页
第4页 / 共15页
socket函数手册_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《socket函数手册》由会员分享,可在线阅读,更多相关《socket函数手册(15页珍藏版)》请在金锄头文库上搜索。

1、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 /*

2、清零 */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

3、);/* 字符串(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 /* 地址字符串转为数值*

4、 参数: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的地

5、址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名称

6、),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

7、组合的系统默认值返回:成功 - 套接口描述字,失败 - -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 s

8、truct 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); /* 指示内核接

9、受一个未连接的套接口上的连接请求* 参数:sockfd - 套接口描述字backlog - 套接口两个队列(完成连接和未完成连接)的排队最大连接个数,各个操作系统有不同的根据backlog计算排队最大连接个数的算法返回:成功 - 0, 失败 - -1*/int listen (int sockfd, int backlog);/* 从已完成连接队列对头返回一个已完成连接,如果已完成连接队列为空,那么进程被阻塞(假设套接口为缺省的阻塞方式)* 参数:sockfd - 监听套接口描述字cliaddr - 输出参数,返回已连接的客户端的协议地址,为NULL,则不返回addrlen - 输出参数,返回

10、套接口地址结构体的大小,为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,

11、 const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKE

12、T_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数据成

13、功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket

14、函数就返回 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连接的另一端接收数据。该函数的第一个参

15、数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号