资源描述:
《数据报套接字编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6讲数据报套接字编程Windows网络编程基础内容提要1、UDP:用户数据报协议2、数据报套接字编程模型3、基本函数4、程序举例5、UDP不可靠性问题6、UDP服务器的并发性1.UDP:用户数据报协议1.1使用TCP传输数据有什么缺点?……服务器三次握手建立连接客户四次交互关闭连接数据传输缺点1:传输开销大!缺点2:资源过耗!服务器客户×××1.2UDP:用户数据报协议多对多通信不可靠服务缺乏流控制报文模式1.3数据报套接字编程的适用场合在可靠的本地环境中运行;在不可靠的广域网环境中运行;广播或多播应用程序;海量
2、数据传输。优点:灵活性缺点:不可靠性不推荐:推荐:1.UDP:用户数据报协议2.数据报套接字编程模型2.1数据报套接字的通信过程①创建套接字,指定使用UDP(不可靠的传输服务)进行通信;②指定本地和远端IP地址和通信端口;④关闭套接字;③进行数据传输;UDPserverbind()socket()recvfrom()blocksuntildatagramreceivedfromclientprocessrequestsendto()well-knowportsocket()sendto()UDPclientrecv
3、from()closesocket()data(request)data(reply)closesocket()2.2数据报套接字的编程模型问题:server如何处理与多个client交互?2.3服务器工作原理serverUDPclient2client1UDPUDPdatagramdatagramSocketreceivebufferListeningserverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectioncon
4、nectionconnectionconnectionTCP服务器的工作原理非连接模式连接模式sendto/sendrecvfrom/recvconnect(指明远程端点地址)sendto(指明目标)recvfrom(记录来源)2.4数据报套接字使用模式2.4数据报套接字使用模式使用连接模式的客户端编程connect()sendto()recvfrom()closesocket()socket()1.UDP:用户数据报协议2.数据报套接字编程模型3.基本函数SOCKETsocket(intaf,inttype,in
5、tprotocol)①创建套接字——socket②指定本地地址——bindintbind(SOCKETs,conststructsockaddr*name,intnamelen)本地端口号本地IP地址SOCK_DGRAM3基本函数intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen)③发送数据——sendto④接收数据——recvfromintrecvfrom(SOCKETs,charFAR*buf
6、,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen)目的IP+目的端口号INADDR_BROADCAST是否可通过from参数控制只接收特定来源的报文?否intsend(SOCKETs,constcharFAR*buf,intlen,intflags)intrecv(SOCKETs,charFAR*buf,intlen,intflags)来源IP+来源端口号怎样指明目标?连接模式怎样获知来源?recvfrom(……,structsockaddrFAR*fro
7、m,……)非连接模式connect(……,structsockaddrFAR*name,……)sendto(……,conststructsockaddrFAR*to,……)连接模式非连接模式connect(……,structsockaddrFAR*name,……)问题1:如何向操作系统注册通信对方的地址?ABABbind()socket()connect()UDP(协议,目标IP,目标端口,源IP,源端口)IP头UDP头数据IP头UDP头数据IP头UDP头数据问题2:如何控制可接收的数据报类型?应用进程接收缓存发送
8、(sendvs.sendto)Send用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Sendto用于SOCK_DGRAM:最常用用于SOCK_STREAM:to和tolen被忽略,此时,sendto=send问题3:如何选择合适的发送函数?接收(recvvs.recvfrom)Recv:只接收已确定了连接