版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第5讲讲 Socket网络编程网络编程2目录目录v网络编程协议基础网络编程协议基础vSocket基本编程技术基本编程技术vSocket高级编程技术高级编程技术3OSI模型与模型与TCP/IP协议栈协议栈网网络络编编程程协协议议基基础础4OSI七层协议功能七层协议功能v 物理层物理层面向物理传输媒体,屏蔽媒体的不同面向物理传输媒体,屏蔽媒体的不同v 链路层链路层面向一条链路,成帧和无差错传输面向一条链路,成帧和无差错传输v 网络层网络层分配地址、面向多条链路、路由和流量控制分配地址、面向多条链路、路由和流量控制v 传输层传输层面向两台主机通信,处理可靠传输细节,无差错、无失序传输面向两台主机
2、通信,处理可靠传输细节,无差错、无失序传输v 会话层会话层面向一次会话,协调双方的交互、同步面向一次会话,协调双方的交互、同步v 表示层表示层面向通信内容的表示,大家认同的描述方式面向通信内容的表示,大家认同的描述方式v 应用层应用层面向建立在通信基础上的应用,为应用提供通信服务面向建立在通信基础上的应用,为应用提供通信服务网网络络编编程程协协议议基基础础5TCP协议特点协议特点v面向连接的可靠传输面向连接的可靠传输端到端、建立端到端、建立/断开连接断开连接正确、顺序传送数据正确、顺序传送数据v协议关注问题协议关注问题IP数据报的丢失、重复、失序、延迟数据报的丢失、重复、失序、延迟发送和接收速
3、度的匹配发送和接收速度的匹配系统重启动,一方连接信息丢失系统重启动,一方连接信息丢失网络拥塞网络拥塞网网络络编编程程协协议议基基础础6UDP协议特点协议特点v无连接无连接不需要在通信前建立连接不需要在通信前建立连接不使用控制报文不使用控制报文传输开销低传输开销低v面向报文面向报文不将报文分割,也不合并不将报文分割,也不合并UDP报文大小直接影响网络利用率报文大小直接影响网络利用率过小造成报头比率过大过小造成报头比率过大过大造成过大造成MTU分片分片v尽力而为、任意交互尽力而为、任意交互一对一、一对多、多对一和多对多一对一、一对多、多对一和多对多网网络络编编程程协协议议基基础础7网络服务的标识网
4、络服务的标识vTCP/UDP端口号端口号作为服务器程序标识作为服务器程序标识服务器启动时,首先在本地主机注册所使用的服务器启动时,首先在本地主机注册所使用的TCP/UDP端口号端口号客户通过与服务器指定的客户通过与服务器指定的TCP端口建立连接端口建立连接(或直接向(或直接向服务器指定的服务器指定的UDP端口发送信息端口发送信息)来访问特定服务)来访问特定服务运行服务器程序的主机收到信息后,将其转交给注册该运行服务器程序的主机收到信息后,将其转交给注册该端口的服务器程序处理端口的服务器程序处理网网络络编编程程协协议议基基础础8客户客户/服务器交互模型服务器交互模型v服务器程序服务器程序被动被动
5、等待请求并做出响应等待请求并做出响应v客户程序客户程序主动主动向服务器发出服务请求向服务器发出服务请求网网络络编编程程协协议议基基础础9客户客户/服务器程序特性对比服务器程序特性对比网网络络编编程程协协议议基基础础10服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案v系统资源要求不高系统资源要求不高v在处理一个请求时其他请求必须等待在处理一个请求时其他请求必须等待v主要针对于主要针对于面向无连接面向无连接的客户的客户/服务器模型服务器模型网网络络编编程程协协议议基基础础11服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案v系统资源要求较高系统资源要求较高v实时性
6、和灵活性是该方案的最大特点实时性和灵活性是该方案的最大特点v主要针对于主要针对于面向连接面向连接的客户的客户/服务器模型服务器模型网网络络编编程程协协议议基基础础12Linux的网络分层结构的网络分层结构vBSD Socket是通用接口,支持各种网络工作形式是通用接口,支持各种网络工作形式vINET Socket支持包括支持包括TCP/IP协议在内的协议在内的Internet地地址族址族网络应用网络应用BSD Socket层层INET Socket层层TCPUDPIPPPPSLIPSocketARP用户数据界面用户数据界面接口界面接口界面协议分层协议分层网络驱动网络驱动网网络络编编程程协协议议
7、基基础础13目录目录v网络通信协议基础网络通信协议基础vSocket基本编程技术基本编程技术vSocket高级编程技术高级编程技术14socket基本概念基本概念vSocket接口是应用程序与接口是应用程序与TCP/IP协议栈的接口协议栈的接口定义一组函数定义一组函数/例程,支持例程,支持TCP/IP网络应用程序开发网络应用程序开发与数据通信相关的系统调用是与数据通信相关的系统调用是read()/write()v是一种文件描述符是一种文件描述符一个套接字描述一个通信连接的一端一个套接字描述一个通信连接的一端两个通信程序中各自有一个套接字来描述自己的两个通信程序中各自有一个套接字来描述自己的vS
8、ocket不是不是TCP/IP标准的组成部分,但已成为事实标准的组成部分,但已成为事实上的工业标准上的工业标准UNIX系列系统提供系列系统提供SocketWindows系列、系列、Macintosh系列、系列、Solaris等亦提供等亦提供网网络络编编程程协协议议基基础础15Socket端到端通信的形式端到端通信的形式v形式形式(IP, PORT)v网络进程标识网络进程标识v网间通信标识网间通信标识v端口分类端口分类公认端口公认端口小于小于256的端口作为的端口作为保留端口保留端口注册端口注册端口动态和动态和/或私有端口或私有端口Socket基基本本编编程程技技术术16基本基本socket A
9、PIvsocket()创建一个新的创建一个新的Socketvclose() 关闭一个关闭一个Socketvbind() 将服务器将服务器(IP, Port)赋予赋予Socketvlisten() 等待到来的客户连接请求等待到来的客户连接请求(TCP)vaccept() 接受客户连接请求并建立连接接受客户连接请求并建立连接(TCP)vconnect() 向服务器发出连接请求向服务器发出连接请求vsend()/recv() 发送发送/接收数据接收数据Socket基基本本编编程程技技术术17字节顺序字节顺序v字节顺序字节顺序大端模式大端模式(big endian):高字节放到高地址上:高字节放到高地
10、址上小端模式小端模式(little endian):高字节放到低地址上:高字节放到低地址上v主机字节顺序主机字节顺序(HBO,Host Byte Order)不同的机器不同的机器HBO不相同,与不相同,与CPU设计有关设计有关Motorola 68k系列,系列,HBO与与NBO相同相同Intel x86系列,系列,HBO与与NBO相反相反v网络字节顺序网络字节顺序(NBO,Network Byte Order)使用统一的字节顺序,避免兼容性问题使用统一的字节顺序,避免兼容性问题v解决兼容性问题途径解决兼容性问题途径往网络上发送前:转换成网络字节序往网络上发送前:转换成网络字节序从网络接收数据:
11、转换成主机字节序从网络接收数据:转换成主机字节序Socket基基本本编编程程技技术术18字节顺序转换函数字节顺序转换函数v头文件头文件#include v函数原型函数原型uint32_t htonl(uint32_t hostlong);把把32位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序 uint16_t htons(uint16_t hostshort);把把16位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序 uint32_t ntohl(uint32_t hostlong);把把32位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序 u
12、int16_t ntohs(uint16_t hostshort);把把16位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序 v说明说明h代表代表host,n代表代表 networks代表代表short,l代表代表long Socket基基本本编编程程技技术术19socket()函数函数v功能功能创建一个套接字创建一个套接字#include v函数原型函数原型int socket(int domain, int type, int protocol);v参数说明参数说明domain:通信协议族,即地址族:通信协议族,即地址族type:套接字类型:套接字类型protocol:通信
13、协议:通信协议常设置为常设置为0 ,由内核根据指定的类型和协议族使用默,由内核根据指定的类型和协议族使用默认的协议认的协议v返回值返回值成功时,返回一个大于等于成功时,返回一个大于等于0的文件描述符的文件描述符失败时,返回一个小于失败时,返回一个小于0的值的值Socket基基本本编编程程技技术术20Linux支持的协议和地址族支持的协议和地址族地址协议协议描述AF_UNIXPF_UNIXUnix域AF_INETPF_INETTCP/IP(V4)AF_INET6PF_INET6TCP/IP(V6)AF_AX25PF_AX25业余无线电使用的AX.25AF_IPXPF_IPXNovell的IPXA
14、F_APPLETALKPF_APPLETALKAppleTalk DDSAF_NETROMPF_NETROM业余无线电使用的 NetRomSocket基基本本编编程程技技术术21套接字类型套接字类型v流套接字流套接字(SOCK_STREAM)可靠的、面向连接的通信可靠的、面向连接的通信使用使用TCP协议协议v数据报套接字数据报套接字(SOCK_DGRAM)无连接服务无连接服务使用使用UDP协议协议v原始套接字原始套接字(SOCK_RAW)允许对底层协议(如允许对底层协议(如IP、ICMP)直接访问)直接访问Socket基基本本编编程程技技术术22socket()函数函数v代码框架代码框架int
15、 main()() int sockfd; if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(“socket”); exit(1); Socket基基本本编编程程技技术术23套接字选项套接字选项v函数原型函数原型int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)int setsockopt(int sockfd, int level, int optname, const void *optval, socklen
16、_t *optlen)v功能功能控制套接字行为,如修改缓冲区大小、传输方式等控制套接字行为,如修改缓冲区大小、传输方式等 v参数说明参数说明level:指定控制套接字的层次:指定控制套接字的层次SOL_SOCKET:通用套接字选项:通用套接字选项IPPROTO_IP:IP选项选项IPPROTO_TCP:TCP选项选项 optname:指定控制方式:指定控制方式(选项名称选项名称)optval:获得:获得/设置套接字选项值设置套接字选项值Socket基基本本编编程程技技术术24 SOL_SOCKET参数选项参数选项SO_BROADCAST允许发送广播数据允许发送广播数据 int SO_DEBUG
17、 允许调试允许调试 int SO_DONTROUTE 不查找路由不查找路由 int SO_ERROR 获得套接字错误获得套接字错误 int SO_KEEPALIVE 保持连接保持连接 int SO_LINGER 延迟关闭连接延迟关闭连接 struct linger SO_OOBINLINE 带外数据放入正常数据流带外数据放入正常数据流 int SO_RCVBUF 接收缓冲区大小接收缓冲区大小 int SO_SNDBUF 发送缓冲区大小发送缓冲区大小 int SO_RCVLOWAT 接收缓冲区下限接收缓冲区下限 int SO_SNDLOWAT 发送缓冲区下限发送缓冲区下限 int SO_RCVT
18、IMEO 接收超时接收超时 struct timeval SO_SNDTIMEO 发送超时发送超时 struct timeval SO_REUSERADDR 允许重用本地地址和端口允许重用本地地址和端口 int SO_TYPE 获得套接字类型获得套接字类型 int SO_BSDCOMPAT 与与BSD系统兼容系统兼容 int Socket基基本本编编程程技技术术25IPPROTO_IP与与IPPRO_TCP参数选项参数选项vIPPROTO_IPIP_HDRINCL在数据包中包含在数据包中包含IP首部首部IP_OPTINOSIP首部选项首部选项IP_TOS服务类型服务类型 IP_TTL生存时间生
19、存时间vIPPRO_TCP TCP_MAXSEGTCP最大数据段的大小最大数据段的大小TCP_NODELAY不使用不使用Nagle算法算法 Socket基基本本编编程程技技术术26套接字选项示例套接字选项示例v更改发送更改发送/接收缓冲区大小接收缓冲区大小接收缓冲区接收缓冲区int nRecvBuf=32*1024; /设置为设置为32Ksetsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int);发送缓冲区发送缓冲区int nSendBuf=32*1024;/设置为设置为32Ksetsockopt(s
20、, SOL_SOCKET, SO_SNDBUF, (const char*)&nSendBuf,sizeof(int); 说明说明对于客户,对于客户,SO_RCVBUF选项必须在选项必须在connect之前设置之前设置对于服务器,对于服务器,SO_RCVBUF选项必须在选项必须在listen前设置前设置 Socket基基本本编编程程技技术术27bind()函数函数v功能功能将将套接字地址套接字地址与所创建的套接字号联系起来与所创建的套接字号联系起来客户端如果只想使用客户端如果只想使用connect(),则无须使用该函数,则无须使用该函数#include v函数原型函数原型int bin
21、d(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);v参数说明参数说明sockfd:调用:调用socket返回的文件描述符返回的文件描述符 my_addr:保存地址信息:保存地址信息(IP地址和端口地址和端口)addrlen:设置为:设置为 sizeof(struct sockaddr)v返回值返回值成功时,返回成功时,返回0失败时,返回失败时,返回-1Socket基基本本编编程程技技术术28sockaddr结构定义结构定义v功能功能保存保存socket信息信息v结构结构struct sockaddr unsigned shor
22、t sa_family; /* 地址族,地址族,AF_xxx */ char sa_data14; /* 协议地址协议地址 */ ; v说明说明sa_family一般为一般为AF_INET(表示(表示TCP/IP)sa_data包含包含socket的的IP地址和端口号地址和端口号/include/linux/socket.hSocket基基本本编编程程技技术术29sockaddr_in结构定义结构定义v功能功能sockaddr的另一种表示形式的另一种表示形式v结构结构struct sockaddr_in short int sin_family; /* 地址族地址族 */ unsigned s
23、hort int sin_port; /* 端口号端口号 */ struct in_addr sin_addr; /* IP地址地址 */ unsigned char sin_zero8; /* 填充填充0,保持与,保持与struct sockaddr等长等长*/ ; v说明说明sin_zero用于将用于将sockaddr_in结构填充到与结构填充到与struct sockaddr等长,可用等长,可用bzero( )或或memset( )函数将其置为函数将其置为0 当当sin_port = 0时,系统随机选择一个未被使用的端口号时,系统随机选择一个未被使用的端口号当当sin_addr = IN
24、ADDR_ANY时,表示填入本机时,表示填入本机IP地址地址 指向指向sockaddr_in的指针和指向的指针和指向sockaddr的指针可相互转换的指针可相互转换struct in_addr _u32 s_addr;Socket基基本本编编程程技技术术30bind()函数示例函数示例 #include #include #include #define MYPORT 3490 int main() int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_fami
25、ly = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = inet_addr(132.241.5.10); bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr); . Socket基基本本编编程程技技术术31connect()函数函数v功能功能建立套接字连接建立套接字连接 #include v函数原型函数原型int connect(int sockfd, const struct sockaddr *serv_addr,
26、socklen_t addrlen);v参数说明参数说明sockfd:调用:调用socket返回的文件描述符返回的文件描述符serv_addr:远程主机远程主机IP 地址和端口地址和端口addrlen:设置为:设置为 sizeof(struct sockaddr)v返回值返回值成功时,返回成功时,返回0失败时,返回失败时,返回-1Socket基基本本编编程程技技术术32connect()函数示例函数示例 #include #include #include #define DEST_IP 132.241.5.10 #define DEST_PORT 23 int main() int sock
27、fd; struct sockaddr_in dest_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); connect(sockfd, (struct sockaddr*)&dest_addr, sizeof(struct sockaddr);Socket基基本本编编程程技技术术33listen()函数函
28、数v功能功能用于用于面向连接面向连接服务器,表明愿意接收连接服务器,表明愿意接收连接#include v函数原型函数原型int listen(int sockfd, int backlog);v参数说明参数说明sockfd:调用:调用socket返回的文件描述符返回的文件描述符backlog:accept()应答之前,允许在进入队列中等待的连应答之前,允许在进入队列中等待的连接数目,出错时返回接数目,出错时返回-1v返回值返回值成功时,返回成功时,返回0失败时,返回失败时,返回-1v说明说明在使用在使用listen()之前,需要调用之前,需要调用bind()绑定到需要的端口,绑定到需要的端口,
29、否则系统内核将会监听一个随机端口否则系统内核将会监听一个随机端口 socket(); bind(); listen();Socket基基本本编编程程技技术术34accept()函数函数v功能功能建立套接字连接,处理单个连接请求(如发送建立套接字连接,处理单个连接请求(如发送/接收数据)接收数据)#include v函数原型函数原型int accept(int sockfd, struct void*addr, socklen_t *addrlen);v参数说明参数说明sockfd:正在监听端口的套接字文件描述符:正在监听端口的套接字文件描述符addr:指向本地数据结构:指向本地数据结构sock
30、addr_in的指针的指针调用调用connect()的信息将存储在该结构中的信息将存储在该结构中addrlen:设置为:设置为sizeof(struct sockaddr_in)v返回值返回值成功时,返回一个成功时,返回一个socket 端口端口失败时,返回失败时,返回-1Socket基基本本编编程程技技术术35accept()函数函数int main() int sockfd, client_fd;struct sockaddr_in remote_addr;/* 客户端地址信息客户端地址信息 */ while(1) sin_size = sizeof(struct sockaddr_in)
31、; if (client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size) = -1) perror(accept); continue; printf(from %sn, inet_ntoa(remote_addr.sin_addr); Socket基基本本编编程程技技术术36send()函数函数v 功能功能通过通过socket发送数据发送数据#include #include v 函数原型函数原型ssize_t send(int sockfd, const void *buf, size_t l
32、en, int flags);v 参数说明参数说明sockfd:发送数据的套接字描述符:发送数据的套接字描述符msg:指向发送数据的指针:指向发送数据的指针len:数据长度:数据长度 flags:一般设置为:一般设置为0v 返回值返回值成功时,返回实际发送的数据的字节数成功时,返回实际发送的数据的字节数失败时,返回失败时,返回-1Socket基基本本编编程程技技术术37recv()函数函数v 功能功能通过通过socket接收数据接收数据#include #include v 函数原型函数原型ssize_t recv(int sockfd, void *buf, size_t len, int
33、flags);v 参数说明参数说明sockfd:要读的:要读的SOCKET描述符描述符 buf:要读的信息的缓冲区:要读的信息的缓冲区len:缓冲的最大长度:缓冲的最大长度 flags:一般设置为:一般设置为0v 返回值返回值成功时,返回实际接收到的数据的字节数成功时,返回实际接收到的数据的字节数失败时,返回失败时,返回-1Socket基基本本编编程程技技术术38send()/recv()中的中的flags说明说明v MSG_DONTROUTEsend()的使用标志,不查找路由表,表示目的主机在本地的使用标志,不查找路由表,表示目的主机在本地网络网络v MSG_OOB接收或者发送接收或者发送带
34、外数据带外数据v MSG_PEEKrecv()的使用标志,查看数据但不从系统缓冲区移走数据的使用标志,查看数据但不从系统缓冲区移走数据v MSG_WAITALLrecv()的使用标志,等待所有数据,的使用标志,等待所有数据,阻塞式接收阻塞式接收,直到满,直到满足条件或发生错误足条件或发生错误读到指定字节时,正常返回,返回值等于读到指定字节时,正常返回,返回值等于len读到文件尾,正常返回,返回值小于读到文件尾,正常返回,返回值小于len操作错误时,返回操作错误时,返回-1Socket基基本本编编程程技技术术39带外数据带外数据v传输层协议使用带外数据传输层协议使用带外数据(out-of-ban
35、d, OOB)来发送来发送一些重要数据一些重要数据若通信一方有重要数据需要通知对方时,协议能将这些若通信一方有重要数据需要通知对方时,协议能将这些数据快速地发送到对方数据快速地发送到对方为发送这些数据,协议一般不使用与普通数据相同的通为发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道道,而是使用另外的通道vLinux套接字机制支持低层协议发送套接字机制支持低层协议发送/接收带外数据接收带外数据,但,但TCP协议没有真正意义上的带外数据协议没有真正意义上的带外数据v为发送重要协议,为发送重要协议,TCP提供提供紧急模式紧急模式机制机制TCP协议在数据段中设置协议在数据段中设置
36、URG位,表示进入紧急模式位,表示进入紧急模式接收方可以对紧急模式采取特殊的处理接收方可以对紧急模式采取特殊的处理这种方式数据不容易被阻塞,且可通过在服务器端程序这种方式数据不容易被阻塞,且可通过在服务器端程序里捕捉里捕捉SIGURG信号来及时接收数据信号来及时接收数据TCP协议每次只能发送和接收协议每次只能发送和接收一个字节一个字节带外数据带外数据Socket基基本本编编程程技技术术40TCP发送带外数据的处理机制发送带外数据的处理机制vTCP总将最后一个字节当作总将最后一个字节当作OOB数据,其余当作普数据,其余当作普通字节通字节不管通过带不管通过带MSG_OOB标志的标志的sendXXX
37、X()函数发送多少函数发送多少字节字节OOB数据,发送端只将最后一个字节当作数据,发送端只将最后一个字节当作OOB数据数据接收端也只能收到一个字节的接收端也只能收到一个字节的OOB数据数据v举例:举例:send(sendfd, ABC, 3, MSG_OOB)TCP将紧急模式将紧急模式URG 置位置位紧急指针定位第三个字节紧急指针定位第三个字节(“C”)前两个字节前两个字节(AB)当作普通字节发送当作普通字节发送Socket基基本本编编程程技技术术41TCP接收带外数据的处理机制接收带外数据的处理机制vTCP提供两种处理模式提供两种处理模式非非OOBINLINE 模式:套接字的默认模式模式:套
38、接字的默认模式将将OOB字节与普通字节分开存放,字节与普通字节分开存放, OOB字节存放在字节存放在一个一个OOB缓冲区中缓冲区中OOBINLINE 模式:模式:OOB字节和普通字节一起存放字节和普通字节一起存放vrecvXXXX函数在函数在MSG_OOB模式下,将在模式下,将在OOB缓缓冲区中寻找数据冲区中寻找数据如果发送端没发送如果发送端没发送OOB字节,它返回错误字节,它返回错误如果发送端发送了如果发送端发送了OOB字节字节对于非对于非OOBINLINE 模式,返回模式,返回1字节的字节的OOB数据数据对于对于OOBINLINE 模式,返回错误,因为模式,返回错误,因为OOB字节没字节没
39、有放到有放到OOB缓冲区中缓冲区中 Socket基基本本编编程程技技术术42sendto()函数函数v功能功能用于用于数据报套接字数据报套接字的通信的通信#include #include v函数原型函数原型int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); v参数说明参数说明to:目地机的:目地机的IP地址和端口号信息地址和端口号信息tolen:常被赋值为:常被赋值为sizeof (struct sockaddr) v返回值返回值
40、成功时,返回实际发送的数据的字节数成功时,返回实际发送的数据的字节数失败时,返回失败时,返回-1Socket基基本本编编程程技技术术43recvfrom()函数函数v功能功能用于用于数据报套接字数据报套接字的通信的通信#include #include v函数原型函数原型int recvfrom(int sockfd,void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); v参数说明参数说明from:保存源机的:保存源机的IP地址及端口号地址及端口号fromlen:常常被赋值为:常常被赋值为si
41、zeof (struct sockaddr) v返回值返回值成功时,返回实际接收到的数据的字节数成功时,返回实际接收到的数据的字节数失败时,返回失败时,返回-1Socket基基本本编编程程技技术术44write()函数函数v函数原型函数原型ssize_t write(int fd, const void *buf, size_t nbytes) v功能功能将将buf中的中的nbytes字节内容写入文件描述符字节内容写入文件描述符fdv返回值返回值成功时返回写的字节数成功时返回写的字节数失败时返回失败时返回-1,并设置,并设置errno变量变量v说明说明返回值大于返回值大于0,表示写入部分或全部
42、数据,表示写入部分或全部数据返回值小于返回值小于0,表示出现错误,表示出现错误如果错误为如果错误为EINTR ,表示在写的时候出现中断错误,表示在写的时候出现中断错误如果为如果为EPIPE,表示网络连接出现问题,表示网络连接出现问题Socket基基本本编编程程技技术术45基于基于write()函数的函数的socket写实现写实现Socket基基本本编编程程技技术术46read()函数函数v函数原型函数原型ssize_t read(int fd, void *buf, size_t nbyte)v功能功能从从fd中读取内容中读取内容v返回值返回值读成功时,返回实际所读的字节数读成功时,返回实际所
43、读的字节数如果返回的值是如果返回的值是0 表示已经读到文件的结束表示已经读到文件的结束,出错时,返回值小于出错时,返回值小于0如果错误为如果错误为EINTR,说明读是由中断引起的,说明读是由中断引起的如果是如果是ECONNREST表示网络连接出了问题表示网络连接出了问题Socket基基本本编编程程技技术术47基于基于read()函数的函数的socket读实现读实现Socket基基本本编编程程技技术术48close()/shutdown()函数函数v 功能功能关闭通讯关闭通讯v 函数原型函数原型int close(int sockfd);int shutdown(int sockfd, int
44、how);v 参数说明参数说明sockfd:要关闭的套接字描述符:要关闭的套接字描述符 how:0 :不允许接收:不允许接收1 :不允许发送:不允许发送2 :不允许发送和接收:不允许发送和接收(和和close() 一样一样)v 返回值返回值成功时,返回成功时,返回0失败时,返回失败时,返回-1Socket基基本本编编程程技技术术49getpeername()/gethostname()函数函数vint getpeername(int sockfd, struct sockaddr* addr, int* addrlen);获取获取socket连接另一端的主机信息连接另一端的主机信息sockfd
45、:是连接的数据流套接口文件描述符:是连接的数据流套接口文件描述符addr:保存另一端主机信息:保存另一端主机信息addrlen:设置为:设置为sizeof(struct sockaddr)vint gethostname(char *hostname, size_t size);返回程序正在运行的计算机的名字返回程序正在运行的计算机的名字返回值返回值如果成功,返回如果成功,返回0如果失败,返回如果失败,返回-1 Socket基基本本编编程程技技术术50IP地址与域名的获取地址与域名的获取v函数原型函数原型#include struct hostent *gethostbyname(const
46、char *name);struct hostent *gethostbyaddr(const char *addr, size_t len, int type);struct hostent char *h_name; /*主机的正式名称主机的正式名称*/ char *h_aliases; /*主机的别名主机的别名*/ int h_addrtype; /*主机的地址类型主机的地址类型 AF_INET */ int h_length; /*主机的地址长度主机的地址长度 对于对于IP4 是是4字节字节32位位*/ char *h_addr_list; /*主机的主机的IP地址列表地址列表*/ #
47、define h_addr h_addr_list0 /*主机的第一个主机的第一个IP地址地址 */;Socket基基本本编编程程技技术术51字符串的字符串的IP与与32的的IP的转换的转换v说明说明 网络上的网络上的IP都是数字加点都是数字加点(192.168.0.1)构成构成struct in_addr结构使用结构使用32位的位的IP,如,如IP(C0A80001)是是192.168.0.1 v函数原型函数原型 int inet_aton(const char *cp, struct in_addr *inp)将将a.b.c.d的的IP转换为转换为32位的位的IP,存储在,存储在 inp指
48、针里面指针里面char *inet_ntoa(struct in_addr in) 将将32位位IP转换为转换为a.b.c.d的格式的格式v说明说明a代表代表 ascii,n代表代表networkSocket基基本本编编程程技技术术52面向连接的面向连接的socket通信流程通信流程客户端客户端s=socket(),建立流式套接字,返回套接字号,建立流式套接字,返回套接字号sconnect(s),将套接字,将套接字s与远程主机连接与远程主机连接recv(s)/send(s),在套接字,在套接字s上读上读/写数据至完成交写数据至完成交换换close(s),关闭套接字,关闭套接字s,结束,结束TC
49、P对话对话s=socket(),建立流式套接字,返回套接字号,建立流式套接字,返回套接字号sbind(s),套接字,套接字s与本地地址相连与本地地址相连listen(s),通知,通知TCP服务器准备好接收连接服务器准备好接收连接ns=accept(s),接收连接,等待客户端的连接,接收连接,等待客户端的连接建立连接,建立连接,accept()返回,得到新的套接字返回,得到新的套接字nsclose(ns),关闭套接字,关闭套接字nsrecv(ns)/send(ns),在套接字,在套接字ns上读上读/写数据至完写数据至完成交换成交换服务器端服务器端close(s),关闭最初套接字,关闭最初套接字s
50、,服务结束,服务结束Socket基基本本编编程程技技术术53面向连接面向连接socket通信流程通信流程v服务器程序作用服务器程序作用初始化服务器程序初始化服务器程序持续监听一个固定的端口持续监听一个固定的端口收到客户的连接后建立一个收到客户的连接后建立一个socket连接连接与客户进行通信和信息处理与客户进行通信和信息处理接收客户通过接收客户通过socket连接发送来的数据,创建一个新连接发送来的数据,创建一个新的的socket,通过通过socket连接与客户通信,进行相应处理,并返回连接与客户通信,进行相应处理,并返回处理结果处理结果通信结束后中断与客户的连接(关闭通信结束后中断与客户的连
51、接(关闭socket)Socket基基本本编编程程技技术术54面向连接的面向连接的socket通信流程通信流程v客户程序作用客户程序作用初始化客户程序初始化客户程序连接到某个服务器上,建立连接到某个服务器上,建立socket连接连接与服务器进行通信和信息处理与服务器进行通信和信息处理接收服务器通过接收服务器通过socket连接发送来的数据,进行相应连接发送来的数据,进行相应处理处理通过通过socket连接向服务器发送请求信息连接向服务器发送请求信息通信结束后中断与客户的连接通信结束后中断与客户的连接Socket基基本本编编程程技技术术55面向连接面向连接socket通信示例通信示例服务器程序服
52、务器程序Socket基基本本编编程程技技术术56面向连接面向连接socket通信示例通信示例服务器程序服务器程序Socket基基本本编编程程技技术术57面向连接面向连接socket通信示例通信示例服务器程序服务器程序Socket基基本本编编程程技技术术58面向连接面向连接socket通信示例通信示例服务器程序服务器程序Socket基基本本编编程程技技术术59面向连接面向连接socket通信示例通信示例客户程序客户程序Socket基基本本编编程程技技术术60面向连接面向连接socket通信示例通信示例客户程序客户程序Socket基基本本编编程程技技术术61面向连接面向连接socket通信示例通信
53、示例客户程序客户程序Socket基基本本编编程程技技术术62面向无连接面向无连接socket通信流程通信流程客户端客户端s=socket(),建立数据报套接字,建立数据报套接字,返回套接字号返回套接字号sbind(s),将套接字,将套接字s与本地主机与本地主机连接连接(可选可选)recvfrom(s)/sendto(s),在套接字,在套接字s上读上读/写数据至完成交换写数据至完成交换close(s),关闭套接字,关闭套接字s,结束,结束UDP对话对话bind(s),套接字,套接字s与本地地址相连与本地地址相连s=socket(),建立数据报套接字,建立数据报套接字,返回套接字号返回套接字号sr
54、ecvfrom(s)/sendto(s),在套接字,在套接字s上读上读/写数据至完成交换写数据至完成交换close(s),关闭套接字,关闭套接字s服务器端服务器端Socket基基本本编编程程技技术术63面向无连接通信适用场景面向无连接通信适用场景v面向数据报面向数据报v网络数据大多为短消息网络数据大多为短消息v拥有大量客户拥有大量客户v对数据安全性无特殊要求对数据安全性无特殊要求v网络负担非常重,但对响应速度要求高网络负担非常重,但对响应速度要求高Socket基基本本编编程程技技术术64面向无连接面向无连接socket通信示例通信示例公共函数公共函数Socket基基本本编编程程技技术术65面向
55、无连接面向无连接socket通信示例通信示例公共函数公共函数Socket基基本本编编程程技技术术66面向无连接面向无连接socket通信示例通信示例服务程序服务程序Socket基基本本编编程程技技术术67面向无连接面向无连接socket通信示例通信示例服务程序服务程序Socket基基本本编编程程技技术术68面向无连接面向无连接socket通信示例通信示例服务器程序服务器程序Socket基基本本编编程程技技术术69面向无连接面向无连接socket通信示例通信示例客户程序客户程序Socket基基本本编编程程技技术术70面向无连接面向无连接socket通信示例通信示例客户程序客户程序Socket基基
56、本本编编程程技技术术71服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案vUDP实现框架实现框架没有一个客户端可以一直占用服务端没有一个客户端可以一直占用服务端只要处理过程不是死循环,则服务器对于每一个客户机只要处理过程不是死循环,则服务器对于每一个客户机的请求总是能够满足的请求总是能够满足 socket(.); bind(.); while(1) recvfrom(.); process(.); sendto(.); Socket基基本本编编程程技技术术72服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案vTCP实现框架实现框架每次接受一个客户端连接每次接受一
57、个客户端连接完成某客户所有请求后,断开连接完成某客户所有请求后,断开连接 socket(.); bind(.); listen(.); while(1) accept(.); recv(.); process(.); send(.); close(.); Socket基基本本编编程程技技术术73服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案vTCP实现框架实现框架 s = socket(.); bind(s, .); listen(s, .); while(1) ns = accept(s, .); if(fork(.)=0) recv(ns, .); process(.);
58、 send(ns, .); close(ns); Socket基基本本编编程程技技术术74多线程客户多线程客户/服务器示例服务器示例线程实现线程实现v功能描述功能描述客户端客户端使用线程向服务器发送从标准输入得到的字符使用线程向服务器发送从标准输入得到的字符在主线程中将从服务器端返回的字符显示到标准输出在主线程中将从服务器端返回的字符显示到标准输出服务器端服务器端将客户端发来的数据原样返回给客户端,每一个客户将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程在服务器上对应一个线程Socket基基本本编编程程技技术术75多线程客户多线程客户/服务器示例服务器示例线程实现线程实现
59、v公共文件公共文件Socket基基本本编编程程技技术术76多线程客户多线程客户/服务器示例服务器示例线程实现线程实现v客户端客户端Socket基基本本编编程程技技术术77多线程客户多线程客户/服务器示例服务器示例线程实现线程实现v客户端客户端Socket基基本本编编程程技技术术Sockfd未实例化!78多线程客户多线程客户/服务器示例服务器示例线程实现线程实现v服务器端服务器端Socket基基本本编编程程技技术术pthread_detach(thread_id)(非阻塞,可立即返回)这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。79多线程客户多线程客户/服务器
60、示例服务器示例线程实现线程实现v服务器端服务器端Socket基基本本编编程程技技术术80目录目录v网络通信协议基础网络通信协议基础vSocket基本编程技术基本编程技术vSocket高级编程技术高级编程技术81阻塞式阻塞式I/Ov可能造成阻塞的函数有:可能造成阻塞的函数有:connect()、accept()、读、读写函数、写函数、select()、poll()、gethostbyname()等等Socket高高级级编编程程技技术术82非阻塞式非阻塞式I/Ov调用可能造成阻塞的函数时,若发生阻塞,函数调用可能造成阻塞的函数时,若发生阻塞,函数返回返回-1并将并将errno设置为设置为EAGAIN或或EWOULDBLOCK,程序可继续向下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门窗套餐活动策划方案(3篇)
- 线上采访活动策划方案(3篇)
- 运动店面活动方案策划(3篇)
- 驼峰改造施工方案(3篇)
- 包馄饨活动策划方案(3篇)
- 路肩修整施工方案(3篇)
- 活动策划绘图方案范文(3篇)
- 医药生产企业安全培训
- 保洁外包服务方案汇报
- 团日活动方案设计
- 《计算机网络技术基础》课程思政方案
- 腰痛的中医治疗
- 2025三力测试考试题库及答案
- 2025秋季学期国开电大法律事务专科《民法学(1)》期末纸质考试总题库珍藏版
- 第四单元课题3物质组成的表示第3课时物质组成的定量认识-九年级化学人教版上册
- 交警国省道巡逻管控课件
- DB11∕T 693-2024 施工现场临建房屋应用技术标准
- T/CSBME 065-2023医用敷料材料聚氨酯泡沫卷材
- T/CECS 10310-2023水性聚氨酯防水涂料
- T/CCT 007-2024煤化工废水处理运营能力评价
- GB/T 45554-2025种猪生产性能测定技术规范
评论
0/150
提交评论