您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Linux从入门到提高-第20章--Linux下的网络编程
第20章Linux下的网络编程套接字编程概述套接字数据结构套接字函数服务器模型域名系统本章小结套接字是网络通信的基本操作单元,它提供了不同主机之间进程双向通信的端点。进程在通信之前各自建立一个Socket,通过对Socket的读写操作来实现数据的传输。常用的Socket类型主要有两种:数据流套接字(StreamSockets)数据报套接字(DatagramSockets)20.1套接字编程概述基于TCP的Socket工作流程20.1套接字编程概述bind()处理服务请求服务器listen()accept()read()write()close()socket()socket()connect()write()read()close()服务请求服务应答建立连接阻塞,等待客户连接客户端基于UDP的Socket工作流程20.1套接字编程概述bind()处理服务请求服务器readfrom()sendto()close()socket()socket()bind()sendto()readfrom()close()服务请求服务应答阻塞,等待客户服务请求客户端在套接字编程过程中,会用到若干个相关的数据结构。本节先对这些数据结构进行介绍,以方便读者对后面接口函数理解。20.2套接字数据结构structsockaddr_in{__SOCKADDR_COMMON(sin_);in_port_tsin_port;structin_addrsin_addr;unsignedcharsin_zero[sizeof(structsockaddr)-__SOCKADDR_COMMON_SIZE-sizeof(in_port_t)-sizeof(structin_addr)];};#define__SOCKADDR_COMMON(sa_prefix)\sa_family_tsa_prefix##familysa_family_tsin_family20.2.1套接字地址结构uint16_thtons(uint16_t__hostshort);uint32_thtonl(uint32_t__hostlong);uint16_tntohs(uint16_t__netshort);uint32_tntohl(uint32_t__netlong);通用套接字地址结构structsockaddr{__SOCKADDR_COMMON(sa_);charsa_data[14];};20.2.1套接字地址结构structhostent{char*h_name;char**h_aliases;inth_addrtype;inth_length;char**h_addr_list;#defineh_addrh_addr_list[0]};服务名结构structservent{char*s_name;char**s_aliases;ints_port;char*s_proto;};20.2.3主机名结构套接字是TCP/IP协议在传输层上向应用程序提供的网络接口,该接口向开发人员提供了大量函数。本节将首先给出基本的套接字接口函数,然后结合实例来介绍编写网络程序的具体方法。20.3套接字函数intsocket(intdomain,inttype,intprotocol);参数domain用来指定要创建的套接字所使用的协议栈,通常为AF_INET,表示Internet地址族;参数type用来指定套接字的类型,即数据流套接字(SOCK_STREAM)或数据报套接字(SOCK_DGRAM);参数protocol通常设为0,表示通过指定的协议栈和套接字的类型就可以确定程序中使用的具体协议,只有在无法惟一确定协议的对应关系时,才需要指定参数protocol。20.3.1创建套接字intbind(intsockfd,structsockaddr*my_addr,intaddrlen);参数sockfd为要绑定的Socket描述符;参数my_addr为一个指向含有本机IP地址和端口号等信息的sockaddr结构的指针;参数addrlen通常设为sockaddr结构的长度。20.3.2绑定套接字intlisten(intsockfd,intbacklog);参数sockfd为进行绑定后Socket描述符;参数backlog用来指定请求队列中允许的最大请求数,系统的默认值一般为20。一个服务请求到达时,如果请求队列已满,则客户进程将会收到拒绝连接的出错信息。20.3.3监听网络端口intaccept(intsockfd,void*addr,int*addrlen);参数sockfd为被监听的Socket描述符;参数addr通常为一个指向sockaddr_in结构的指针,结构中存放提出连接请求服务的主机IP地址和端口号等信息;addrlen通常设为sockaddr结构的长度。如果程序不关心客户进程的IP地址和端口号,也可将参数addr和addrlen设为NULL。20.3.4接受连接请求intconnect(intsockfd,structsockaddr*serv_addr,int*addrlen);参数sockfd为Socket描述符;参数serv_addr为指向sockaddr结构的指针,该结构中存放要连接的服务器的IP地址和端口号等信息;addrlen通常设为sockaddr结构的长度。20.3.5建立连接intsend(intsockfd,constvoid*msg,intlen,unsignedintflags);参数sockfd为准备发送数据的Socket描述符;参数msg为一个指针,指向所要发送的数据;参数len为希望发送的字节数;参数flags为控制选项,一般情况下设为0即可,也可以使下面几个选项的组合:MSG_OMBMSG_DONTROUTEMSG_DONTWAIT20.3.6面向连接的数据传输intrecv(intsockfd,void*buf,intlen,unsignedintflags);参数sockfd为准备接收数据的Socket描述符;参数buf为存放接收数据的缓冲区;参数len为缓冲的字节数;参数flags为控制选项,一般情况下设为0即可,也可以使下面几个选项的组合:MSG_OOBMSG_PEEKMSG_WAITALL20.3.6面向连接的数据传输intsendto(intsockfd,constvoid*msg,intlen,intflags,conststructsockaddr*to,int*tolen);该函数比send函数多了两个参数,参数to为指向sockaddr结构的指针,该结构中存放目的主机的IP地址和端口号等信息,参数tolen通常设为sockaddr结构的长度。由于在数据报Socket模式下,本地套接字并没有与目的主机建立连接。所以,在发送数据时要指明目的地址。20.3.7无连接的数据传输intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,intfromlen);该函数比recv函数多了两个参数,参数from为指向sockaddr结构的指针,该结构中存放源主机的IP地址和端口号等信息,参数fromlen通常设为sockaddr结构的长度。20.3.7无连接的数据传输intclose(intsockfd);参数sockfd为要关闭的Socket描述符。intshutdown(intsockfd,inthowto);参数sockfd为要关闭的Socket描述符,参数howto为控制选项可取值为:SHUT_RDSHUT_WRSHUT_RDWR20.3.8关闭套接字Linux系统中服务器模型主要有两种:循环服务器和并发服务器。循环服务器是指服务器在同一时刻只可以响应一个客户端的请求;而并发服务器是指服务器在同一个时刻可以响应多个客户端的请求。20.4服务器模型TCP循环服务器:socket(...);bind(...);listen(...);while(1){accept(...);while(1){recv(...);process(...);send(...);}close(...);}20.4.1循环服务器UDP循环服务器:socket(...);bind(...);while(1){recvfrom(...);process(...);sendto(...);}20.4.1循环服务器socket(...);bind(...);listen(...);while(1){accept(...);if(fork(..)==0){while(1){recv(...);process(...);send(...);}close(...);exit(...);}close(...);}20.4.2并发服务器由于IP地址难以记忆和识别,人们更习惯于通过域名来访问主机。这就需要是用域名服务器(DNS)来进行域名和IP地址之间的转换。20.5域名系统structhostent*gethostbyname(constchar*name);通过地址获取主机信息structhostent*gethostbyaddr(constchar*addr,size_tlen,inttype);获取本地主机信息intgethostname(char*name,size_tlen);20.5.1通过域名获取主机信息20.6本章小结本章主要知识点:套接字类型和工作流程套接字数据结构套接字函数服务器模型域名系统
本文标题:Linux从入门到提高-第20章--Linux下的网络编程
链接地址:https://www.777doc.com/doc-7945049 .html