




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第20章基本套接字编程,套接字编程简述套接字数据结构基本套接字函数套接字选项TCP套接字编程UDP套接字编程小结,20.1套接字编程简述,套接字是位于应用层与TCP/IP协议族通信的中间软件抽象层,它逻辑上位于传输层与应用层之间,实际上由一组网络编程API组成。套接字的英文名称是Socket,也称为插口或者套接字。Socket数据传输是一种特殊的I/O。,20.1.1半相关与全相关,在网络通信模型中,一个连接一旦建立,则必然包括以下要素:协议、本地地址、本地端口号、远端地址和远端端口号。这样的一组要素,称为五元组或全相关。其中,协议、本地地址和本地端口号,这三个要素惟一地标识了网络连接的本地进程,而协议、远端地址和远端端口号则惟一地标识了网络连接的对端进程。这三项要素又称为三元组。由于三元组指定了一个完整的网络连接的半部分,所以称为半相关。,20.1.2地址族与协议族,Linux套接字支持多种协议族。协议族也称为域,不同的协议族定义了不同的通信环境。常见的协议族及作用的环境如下:PF_UNIX/PF_LOCAL/PF_FILE:用于主机内进程间通信PF_INET:Ipv4网络通信协议,用于远程主机间通信PF_INET6:用于Ipv6网络通信PF_IPX:用于NovellIPX网络通信PF_X25:用于ITU-TX.25/ISO-8208网络通信,20.1.3面向连接与面向无连接,在套接字编程模型中,存在面向连接的服务和面向无连接的服务。面向连接的服务类似于电话系统,无连接服务则类似于电报系统。,20.1.4套接字类型,在创建套接字时,除需要指定协议族外,还需要指定套接字的类型。Linux系统支持多种套接字类型,主要包括:流式套接字(SOCK_STREAM)数据报套接字(SOCK_DGRAM)原始套接字(SOCK_RAW),20.1.5字节序,字节序是指占内存大于一个字节的类型的数据在内存中的存储顺序,按照不同的顺序可以划分为小端字节序、大端字节序两种,统称为主机字节序。,20.1.6套接字连接方式,在面向连接的套接字编程模式下,可以根据应用的需要构建不同的连接方式。主要包括:短连接方式:指在每进行一次通信报文收发交易时都需要先建立连接,然后进行数据收发,收发完毕后立即断开连接。长连接方式:指客户机与服务器建立好通讯连接,然后进行报文发送和接收。报文发送与接收完毕后,连接并不断开而继续存在,以便进行下一次的数据收发。,20.1.7数据传输方式,连接建立完成后,在数据发送与接收过程中也存在不同的方式,主要包括同步和异步两种方式。对于同步方式来说,报文发送和接收是同步进行的,即报文发送后,发送方等待接收方处理完成并返回应答报文。同步方式需要考虑超时问题,报文发出后发送方需要设定超时时间,超时后发送方不再继续等待,而直接返回。对于异步方式来说,发送方只负责发送数据,不需要等待接收任何返回数据;而接收方只负责接收数据。通常情况下,异步方式在客户端和服务器端各有两个进程专门负责数据收发。这两个进程相互独立,互不影响。,20.2套接字数据结构,在套接字编程接口函数中,定义了若干数据结构。这些数据结构大多为结构类型,基本上所有的套接字函数都会用到这些结构的内容。,20.2.1套接字地址结构,structsockaddr_in_SOCKADDR_COMMON(sin_);in_port_tsin_port;structin_addrsin_addr;/*Padtosizeofstructsockaddr.unsignedcharsin_zerosizeof(structsockaddr)-_SOCKADDR_COMMON_SIZE-sizeof(in_port_t)-sizeof(structin_addr);,20.2.2通用套接字地址结构,Linux系统支持多种不同的地址族,每种地址族的结构内容是各不相同的,例如,internet地址族的地址结构是sockaddr_in,而UNIX地址族的地址结构是sockaddr_un等。在向套接字的编程接口函数传递地址结构指针时,需要将各不相同的地址结构转换为一个通用的数据结构,这就是通用套接字地址结构。structsockaddr_SOCKADDR_COMMON(sa_);charsa_data14;,20.2.3主机名称数据结构,主机名称数据结构hostent定义了主机名与IP地址的对应关系。在套接字编程模型中,与地址绑定相关的操作都需要使用该结构。structhostentchar*h_name;char*h_aliases;inth_addrtype;inth_length;char*h_addr_list;#defineh_addrh_addr_list0;,20.2.4服务名称数据结构,Linux系统提供了对/etc/services文件进行操作的一系列函数,包括getservbyname、getservbyport等。这些函数都需要使用服务名称数据结构structservent。structserventchar*s_name;char*s_aliases;ints_port;char*s_proto;,20.2.5通用数据收发结构,调用通用数据收发函数sendmsg和recvmsg时,需要用到一个类型为structmsghdr的结构,这里称其为通用数据收发结构。structmsghdrvoid*msg_name;socklen_tmsg_namelen;structiovec*msg_iov;size_tmsg_iovlen;void*msg_control;size_tmsg_controllen;intmsg_flags;,20.3基本套接字函数,字节操作函数字节序操作函数地址转换函数套接字函数,20.3.1字节操作函数,Linux系统提供了两组函数:一组是以字母b开头的bzero、bcopy,bcmp等函数;另外一组是以mem开头的内存操作函数,函数原型分别为:voidbzero(void*_s,size_t_n);voidbcopy(_constvoid*_src,void*_dest,size_t_n);intbcmp(_constvoid*_s1,_constvoid*_s2,size_t_n);void*memset(void*_s,int_c,size_t_n);void*memcpy(void*_restrict_dest,_constvoid*_restrict_src,size_t_n);intmemcmp(_constvoid*_s1,_constvoid*_s2,size_t_n);,20.3.2字节序操作函数,Linux系统提供了一系列字节序转换函数:uint16_thtons(uint16_t_hostshort);uint32_thtonl(uint32_t_hostlong);uint16_tntohs(uint16_t_netshort);uint32_tntohl(uint32_t_netlong);,20.3.3地址转换函数,从点分十进制形式转换为套接字内部数据类型的函数有:in_addr_tinet_aton(_constchar*_cp,structin_addr*_inp);intinet_pton(int_af,_constchar*_restrict_cp,void*_restrict_buf);in_addr_tinet_addr(_constchar*_cp);从套接字内部数据类型转化为点分十进制形式的函数有:char*inet_ntoa(structin_addr_in);_constchar*inet_ntop(int_af,_constvoid*_restrict_cp,char*_restrict_buf,socklen_t_len);,20.3.4套接字函数,socket函数bind函数connect函数listen函数accept函数send函数和recv函数sendto函数和recvfrom函数sendmsg函数和recvmsg函数close函数和shutdown函数getsockname函数和getpeername函数,20.3.4套接字函数,socket函数用来创建套接字,其原型为:intsocket(int_domain,nt_type,int_protocol);常用的套接字类型有:SOCK_STREAMSOCK_DGRAMSOCK_RAW,20.3.4套接字函数,bind函数的作用是为套接字绑定IP地址和端口,其原型如下所示。intbind(int_fd,_CONST_SOCKADDR_ARG_addr,socklen_t_len),20.3.4套接字函数,connect函数用于建立与TCP服务器的连接。该函数一般用于客户端编程中。通过调用connect,实际上在TCP协议中发起了三次握手的过程。其原型如下:intconnect(int_fd,_CONST_SOCKADDR_ARG_addr,socklen_t_len);,20.3.4套接字函数,listen函数用于在指定套接字启动监听,该函数只在服务器端编程中调用,其原型如下所示。intlisten(int_fd,int_n);,20.3.4套接字函数,在服务器调用listen后,客户端调用connect连接至服务器。从listen函数的说明中可以看到,服务器在TCP层为这些客户端连接维持了一个队列。accept函数就是由从这个队列中取出一个已完成的连接。其原型如下:intaccept(int_fd,_SOCKADDR_ARG_addr,socklen_t*_restrict_addr_len);,20.3.4套接字函数,send和recv函数用于在流式套接字中发送和接收数据,函数原型如下:ssize_tsend(int_fd,_constvoid*_buf,size_t_n,int_flags);ssize_trecv(int_fd,void*_buf,size_t_n,int_flags);,20.3.4套接字函数,sendto和recvfrom用于数据报套接字的数据收发,函数原型如下:ssize_tsendto(int_fd,_constvoid*_buf,size_t_n,int_flags,_CONST_SOCKADDR_ARG_addr,socklen_t_addr_len);ssize_trecvfrom(int_fd,void*_restrict_buf,size_t_n,int_flags,_SOCKADDR_ARG_addr,socklen_t*_restrict_addr_len);,20.3.4套接字函数,sendmsg和recvmsg函数是通用的数据收发函数,不仅可以用于在流式套接字中收发数据(代替send和recv),还可以用于在数据报套接字中发送和接收数据(代替sendto和recvfrom),函数原型如下:ssize_tsendmsg(int_fd,_conststructmsghdr*_message,int_flags);ssize_trecvmsg(int_fd,structmsghdr*_message,int_flags);,20.3.4套接字函数,close和shutdown函数都用于关闭套接字。close是与文件操作的close共用的函数,而shutdown则是套接字专用的函数。函数原型如下:intclose(int_fd);intshutdown(int_fd,int_how);,20.3.4套接字函数,getsockname和getpeername函数分别用于获取与套接字关联的本地连接信息和远程信息。函数原型如下:intgetpeername(int_fd,_SOCKADDR_ARG_addr,socklen_t*_restrict_len);intgetsockname(int_fd,_SOCKADDR_ARG_addr,socklen_t*_restrict_len);,20.4套接字选项,套接字选项函数SO_KEEPALIVE选项SO_LINGER选项SO_RCVBUF和SO_SNDBUF选项SO_RCVTIMEO和SO_SNDTIMEO选项SO_REUSEADDR和SO_REUSEPORT选项,20.4.1套接字选项函数,getsockopt和setsockopt函数用来获取或者设置套接字选项,函数原型如下:intgetsockopt(int_fd,int_level,int_optname,void*_restrict_optval,socklen_t*_restrict_optlen);setsockopt(int_fd,int_level,int_optname,_constvoid*_optval,socklen_t_optlen);,20.4.2SO_KEEPALIVE选项,SO_KEEPALIVE选项用于探测对方主机是否崩溃。一旦在套接字上打开该选项,如果在两个小时内没有任何数据收发,系统将自动向对方发送一个探测包。根据TCP/IP协议的要求,对方的TCP协议在收到这个探测包后,必须进行响应。响应可以分为以下三种情况:对方回复以明确的响应对方已崩溃或者重启的信息对方未对探测包做出任何响应,20.4.3SO_LINGER选项,通常情况下,在数据收发完成后,应用程序将调用close关闭套接字。TCP/IP协议在默认状态下,会将底层协议中发送缓冲区的数据发送完成后,再关闭连接。在某些情况下,可能需要对该默认处理方式进行修改,这时就需要用到SO_LINGER选项。SO_LINGER选项的获取和设置需要用到一个特殊的数据结构structlinger。structlingerintl_onoff;intl_linger;,20.4.4SO_RCVBUF和SO_SNDBUF选项,TCP/IP协议的底层为每一个套接字建立了两个缓冲区:发送缓冲区和接收缓冲区。在应用程序中调用send或recv收发数据,实际上是向这两个缓冲区中拷贝数据,真正的数据收发由TCP/IP协议去完成。默认情况下,这个缓冲区的内容大致为40968192字节。在每次收发数据量比较大的情况下,可以适当调整该参数的大小,以避免不断的循环收发,提高效率。,20.4.5SO_RCVTIMEO和SO_SNDTIMEO选项,在阻塞模式下,可以为套接字设置读写操作的超时时间。超时时间的设置可以达到微秒级的精确度。设置该参数时,需要用到一个结构timeval。structtimeval_time_ttv_sec;_suseconds_ttv_usec;,20.4.6SO_REUSEADDR和SO_REUSEPORT选项,在Linux系统中,在套接字正常关闭或程序退出后,一段时间内该端口将仍然保持被绑定的状态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西省2025-2026学年高三(上)开学摸底历史试卷(含答案)
- 项目型组织中的团队动态管理研究-洞察及研究
- 部门月度安全培训主题课件
- 【小升初真题】2025年贵州省黔南州小升初数学试卷(含答案)
- 核子结构演化-洞察及研究
- 基于区块链技术的刀板架全生命周期溯源系统在HACCP体系中的应用
- 基于BIM的空心顶全生命周期运维成本动态模拟模型构建
- 垃圾分类体系缺失导致的一次性杯回收率断崖现象
- 国际标准框架下化学品安全数据共享机制构建难点
- 国产高端锯片在航空航天领域应用的技术壁垒与突破点
- 《立在地球边上放号》《峨日朵雪峰之侧》比较阅读教案2024-2025学年高中语文必修上册
- TSG+81-2022+场(厂)内专用机动车辆安全技术规程
- 柴油发电机系统维修保养记录表
- 《MEDDIC销售培训》课件
- 计算机网络-第5版-严伟-潘爱民-课后答案
- 某银行装修工程服务方案投标文件(技术方案)
- 专题26 尺规作图(讲义)
- 部队理想信念课件
- 2024年全国中小学校党组织书记网络培训示范班在线考试题库及答案
- 中医诊所药品名录表
- 人音版小学四年级音乐上电子全册教案
评论
0/150
提交评论