Unix网络编程API.doc
《Unix网络编程API.doc》由会员分享,可在线阅读,更多相关《Unix网络编程API.doc(36页珍藏版)》请在咨信网上搜索。
1、Unix网络编程API1.字节序函数#include uint16_t htons(uint16_t host16bitvalue);uint32_t htonl(uint32_t host32bitvalue);返回:网络字节序值uint16_t ntohs(uint16_t net16bitvalue);uint32_t ntohl(uint32_t net32bitvalue);返回:主机字节序值一个测试本机字节序的程序,可参见见unpv12e:intro/byteorder.c。2.字节操作函数#include void bzero(void *dest, size_t nbytes)
2、;void bcopy(const void *src, void *dest, size_t nbytes);int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);返回:0相等,非0不相等#include void *memset(void *dest, int c, size_t len);void *memcpy(void *dest, void *src, size_t nbytes);int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);返回:0相同
3、,0或0不相同;进行比较操作时,假定两个不相等的字节均为无符号字符(unsigned char)。3.地址转换函数#include int inet_aton(const char *strptr, struct in_addr *addrptr);返回:1串有效,0串有错。in_addr_t inet_addr(const char *strptr);返回:若成功,返回32为二进制的网络字节序地址;若有错,则返回INADDR_NONE。char *inet_ntoa(struct in_addr inaddr);返回:指向点分十进制数串的指针。int inet_pton(int family
4、, const char *strptr, void *addrptr);返回:1成功;0输入不是有效的表达格式,-1出错。const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);返回:指向结果的指针成功,NULL失败。说明: inet_aton函数的指针若为空,则函数仍然执行输入串的有效性检查,但不存储任何结果。 inet_addr的缺陷:出错返回值INADDR_NONE等于255.255.255.255(IPv4的有限广播地址),所以该函数不能处理此地址。尽量使用inet_aton,不
5、使用inet_addr。 inet_ntoa函数的执行结果放在静态内存中,是不可重入的。 参数family可以是AF_INET,也可以是AF_INET6,若参数family不被支持,则出错,errno置为EAFNOSUPPORT。 指针addrptr是结构指针。 len指定目标的大小,避免缓冲区溢出。如果len太小,则返回一个空指针,errno置为ENOSPC。为有助于规定该大小,有如下定义:#include #define INET_ADDRSTRLEN 16 /*fro IPv4 dotted-decimal */#define INET6_ADDRSTRLEN 46 /*for IPv6
6、 hex string */ inet_ntop函数的参数strptr不能为空指针,成功时,此指针即是函数的返回值。实现IPv4版本的inet_pton和inet_ntop的程序,参见:unpv12e:libfree/inet_pton_ipv4.c和libfree/inet_ntop_ipv4.c。4.readn、writen和readline函数原型如下:ssize_t readn(int filedes, void *buff, size_t nbytes);ssize-t writen(int filedes, void *buff, size_t nbytes);ssize_t re
7、adline(int filedes, void *buff, size_t maxlen);返回:读写字节数,-1出错。实现程序见:unpv12e:lib/readn.c、lib/writen.c、lib/readline1.c和lib/readline.c。5.测试描述符类型#include int isfdtype( int fd, int fdtype);返回:1是指定类型,0不是指定类型,-1出错。要测试是否为套接口描述子,fdtype应设为S_IFSOCK。该函数的一个实现程序,参见unpv12e:lib/isfdtype.c6.socket函数#include int socke
8、t(int family, int type, int protocol);返回:非负描述字成功,-1出错。family指定协议族,有如下取值: AF_INETIPv4协议 AF_INET6IPv6协议 AF_LOCALUnix域协议 AF_ROUTE路由套接口 AF_KEY密钥套接口type指定套接口类型: SOCK_STREAM字节流套接口 SOCK_DGRAM数据报套接口 SOCK_RAW原始套接口protocol一般设为0,除非用在原始套接口上。并非所有family和type的组合都是有效的。AF_LOCAL等于早期的AF_UNIX。7.connect函数#include int co
9、nnect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);返回:0成功,-1出错。sockfd是socket函数返回的套接口描述字,servaddr和addrlen是指向服务器的套接口地址结构指针和结构大小。在调用connect之前不必非得调用bind函数。如果是TCP,则connect激发TCP的三路握手过程,在阻塞情况下,只有在连接建立成功或出错时该函数才返回,出错情况: 没有收到SYN分节的响应,在规定时间内经过重发仍无效,则返回ETIMEDOUT; 如果对SYN分节的响应是RST,表示服务器在指定端口上没
10、有相应的服务,返回ECONNREFUSED; 如果发出 SYN在中间路由器上引发一个目的地不可达ICMP错误,在规定时间内经过重发仍无效,则返回EHOSTUNREACH或ENETUNREACH错误。注意:如果connect失败,则套接口将不能再使用,必须关闭,不能对此套接口再调用函数connect。8.bind函数#include int bind(int sockfd, const struct sockaddr *maddr, socklen_t addrlen);返回:0成功,-1出错。进程可以把一个特定的IP地址捆绑到他的套接口上,但此IP地址必须是主机的一个接口。对于IPv4,通配地
11、址是INADDR_ANY,其值一般为0;使用方法如下:struct sockaddr_in servaddr;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);对于IPv6,方法如下:struct sockaddr_in6 serv;serv.sin6_addr = in6addr_any; (系统分配变量in6addr_any并将其初始化为常值IN6ADDR_ANY_INIT。)如果让内核选择临时端口,注意的是bind并不返回所选的断口值,要得到一个端口,必须使用getsockname函数。bind失败的常见错误是EADDRINUSE(地址已使用)。9
12、.listen函数#include int listen(int sockfd, int backlog);返回:0成功,-1出错。listen把未连接的套接口转化为被动套接口,指示内核应接受指向此套接口的连接请求。第二个参数规定了内核为此套接口排队的最大连接数。参数backlog曾经规定为监听套接口上的未完成连接队列和已完成连接队列总和的最大值,但各个系统的定义方法都不尽相同;历史上常把backlog置为5,但对于繁忙的服务器是不够的;backlog的设置没有一个通用的方法,依情况而定,但不要设为0。10.accept函数#include int accept(int sockfd, str
13、uct sockaddr *cliaddr, socklen_t *addrlen);返回:非负描述字OK,-1出错。accept从已完成连接队列头返回下一个连接,若已完成连接队列为空,则进程睡眠(套接口为阻塞方式时)。参数cliaddr和addrlen返回连接对方的协议地址,其中addrlen是值-结果参数,调用前addrlen所指的整数值要置为cliaddr所指的套接口结构的长度,返回时由内核修改。accept成功执行后,返回一个连接套接口描述字。如果对客户的协议地址没有兴趣,可以把cliaddr和addrlen置为空指针。11.close函数#include int close(int
14、sockfd);返回:0OK,-1出错。TCP套接口的close缺省功能是将套接口做上“已关闭”标记,并立即返回到进程。这个套接口描述字不能再为进程使用,但TCP将试着发送已排队待发的任何数据,然后按正常的TCP连接终止序列进行操作。close把描述字的访问计数减1,当访问计数仍大于0时,close并不会引发TCP的四分组连接终止序列。若确实要发一个FIN,可以用函数shutdown。12.getsockname和getpeername#include int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addr
15、len);int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);返回:0OK,-1出错。getsockname函数返回与套接口关联的本地协议地址。getpeername函数返回与套接口关联的远程协议地址。addrlen是值-结果参数。使用场合: 在不调用bind的TCP客户,当connect成功返回后,getsockname返回分配给此连接的本地IP地址和本地端口号; 在以端口号为0调用bind后,使用getsockname返回内核分配的本地端口号; getsockname可用来获取某套接口的地址族
16、; 在捆绑了通配IP地址的TCP服务器上,当连接建立后,可以使用getsockname获得分配给此连接的本地IP地址; 当一个服务器调用exec启动后,他获得客户身份的唯一途径是调用getpeername函数。13.select函数#include #include int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);返回:准备好描述字的正数目,0超时,-1出错。结构timeval的定义:struct timeval long t
17、v_sec; /* seconds */long tv_usec; /* microseconds */;timeout取值的三种情况: 永远等下去:仅在有一个描述字准备好I/O时才返回,设置timeout为空指针; 等待固定时间:在有一个描述字准备好I/O时返回,但不超过由timeout参数所指定的秒数和微秒数; 根本不等待:检查描述字后立即返回,将timeout中的秒数和微秒数都设置为0。在等待过程中,若进程捕获了信号并从信号处理程序返回,等待一般被中断,为了可移植性,必须准备好select返回EINTR错误。timeout的值在返回时并不会被select修改(const标志)。reads
18、et、writeset、exceptset指定我们要让内核测试读、写和异常条件所需的描述字。当前支持的异常条件有两个:1. 套接口带外数据的到达;2. 控制状态信息的存在,可从一个已置为分组方式的伪终端主端读到。描述字集的使用:数据类型:fd_set;void FD_ZERO(fd_set *fdset);void FD_SET(int fd, fd_set *fdset);void FD_CLR(int fd, fd_set *fdset);void FD_ISSET(int fd, fd_set *fdset);参数maxfdp1指定被测试的描述字个数,它的值是要被测试的最大描述字加1。描
19、述字0,1,2,maxfdp1-1都被测试。readset、writeset、exceptset是值-结果参数,select修改三者所指的描述字集。所以,每次调用select时,我们都要将所有描述字集中关心的位置为1。套接口准备好读的条件: 套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度的当前值。对这样的套接口的读操作将不阻塞并返回一个大于0的值(即准备好读入的数据量)。可以用套接口选项SO_RCVLOWAT来设置低潮限度,对于TCP和UDP,缺省值为1; 连接的读这一半关闭(接收了FIN的TCP连接)。对这样的套接口读操作将不阻塞并且返回0(即文件结束符); 套接口是一个监听
20、套接口且已完成的连接数为非0; 有一个套接口错误待处理。对这样的套接口读操作将不阻塞且返回一个错误,errno设置成明确的错误条件。这些待处理错误也可以通过指定套接口选项SO_ERROR调用getsockopt来取得并清除。套接口准备好写的条件: 套接口发送缓冲区中的可用字节数大于等于套接口发送缓冲区低潮限度的当前值,且或者(1)套接口已连接,或者(2)套接口不要求连接(如UDP套接口)。可以用套接口选项SO_SNDLOWAT来设置此低潮限度,对于TCP和UDP,缺省值为2048; 连接的写这一半关闭。对这样的套接口写将产生信号SIGPIPE; 有一个套接口错误待处理。对这样的套接口写操作将不
21、阻塞且返回一个错误,errno设置成明确的错误条件。这些待处理错误也可以通过指定套接口选项SO_ERROR调用getsockopt来取得并清除。如果一个套接口存在带外数据或者仍处于带外标记,那它有异常条件待处理。一个套接口出错时,它被select标记为既可读又可写。14.shutdown函数#include int shutdown(int sockfd, int howto);返回:0成功,-1失败。函数的行为依赖于参数howto的值: SHUT_RD:关闭连接的读这一半,不再接收套接口中的数据且留在套接口缓冲区中的数据都作废。进程不能再对套接口任何读函数。调用此函数后,由TCP套接口接收的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unix 网络 编程 API
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。