第3讲 传送-(1)流套接字编程_第1页
第3讲 传送-(1)流套接字编程_第2页
第3讲 传送-(1)流套接字编程_第3页
第3讲 传送-(1)流套接字编程_第4页
第3讲 传送-(1)流套接字编程_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3讲流套接字编程Windows网络编程基础内容提要1.TCP:传输控制协议2.流式套接字编程模型3.基本函数4.程序举例5.程序运行过程分析1.TCP:传输控制协议运输层协议TCPTranspotControlProtocol,传输控制协议面向连接提供高可靠性服务,用于一次传输要交换大量报文的情形。增加许多开销:确认、流量控制、计时器以及连接管理等。TCP的正常的连接建立和关闭SYN,SEQ=x客户进程服务器进程LISTEN(被动打开)(主动打开)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHED(主动关闭)FIN_WAIT_1CLOSE_WAIT(被动关闭)FIN_WAIT_2LAST_ACKTIME_WAITCLOSED(全双工数据传送阶段)SYN,ACK,SEQ=y,ACK=x+1ACK,SEQ=x+1,ACK=y+1FIN,SEQ=uACK,SEQ=v,ACK=u+1FIN,ACK,SEQ=v,ACK=u+1ACK,SEQ=u+1,ACK=v+1TIME_WAITCLOSE_WAITSYN_RCVDESTABLISHEDTCP

机CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主动打开被动打开被动关闭主动关闭起点被动打开主动打开发送SYN同时打开收到SYN,发送SYN,ACK收到ACK数据传送阶段

关闭发送FIN

关闭发送FIN

关闭发送FIN收到RST

收到SYN发送SYN,ACK

关闭或超时收到ACK

收到SYN,ACK发送ACK收到ACK收到ACK收到FIN发送ACK收到FIN,ACK

发送ACK收到FIN发送ACK同时关闭收到FIN发送ACK发送SYN定时经过两倍报文段寿命后关闭1.TCP:传输控制协议2.流式套接字编程模型1).流套接字编程模型基础传输方式客户机/服务器方式特点面向连接过程

服务器进程和客户端进程在通信前必须创建各自的套接字,建立连接,然后对相应的套接字进行“读”、“写”操作,实现数据的传输。2).流套接字编程的适用场合适用场合:大数据量的数据传输应用可靠性要求高的传输应用3).通信过程服务器通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定本地地址和通信端口;④等待客户端的连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windowssocketsdll的使用。客户端通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定服务器地址和通信端口;④向服务器发送连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windowssocketsdll的使用。3).通信过程4).客户-服务器交互模型socket(),建立流式套接字,返回套接字标识s

bind(),使套接字s与本地地址相连listen(),在套接字s上侦听连接请求accept(),准备接收客户连接;accept返回,创建新套接字ns,原套接字s仍处于侦听状态;socket(),建立流式套接字,返回套接字标识s

connect(),s与服务器建立连接recv/send(),在ns上读写数据closesocket(),关闭s,通信结束closesocket(),关闭套接字nsclosesocket(),关闭套接字s,服务结束服务器客户端recv/send(),在s上读写数据问题:server如何处理与多个client建立连接?ListeningserverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectionconnectionconnectionconnection5).流式套接字服务器工作原理1.TCP:传输控制协议2.流式套接字编程模型3.基本函数①创建套接字——socket函数定义:SOCKETsocket(intaf,inttype,intprotocol);输入参数:

af:指定网络地址类型,一般取AF_INET,表示该套接字在Internet域中进行通信;

type:指定套接字类型,这里取SOCK_STREAM,表创建的套接字是流套接字;

protocol:指定网络协议,取0表示默认为TCP/IP协议。返回值:正确:创建的套接字句柄SOCKET

错误:INVALID_SOCKET(WSAGetLastError)功能:创建一个套接字,用于以后的数据传输说明:该函数调用指定了五元组中的“协议”一元。服务器和客户端都要创建,服务器总是先于客户进程启动。

①创建套接字——socketAF_XXX与PF_XXXAF_前缀表示地址族,PF_前缀表示协议族。目前头文件(socket.h)中为一给定协议定义的PF_值总是与此协议的AF_值相等。尽管这种相等关系并不保证永远正确,若有人试图给已有的协议改变这种约定,则许多现存代码都将崩溃,目前两个值混用现象比较多。②指定本地地址——bind函数定义:

intbind(SOCKETs,conststructsockaddr*name,intnamelen);输入参数:

s:标识一个未捆绑套接字的句柄,用来等待客户机的连接;

name:赋予套接字的地址,由structsockaddr结构表示;

namelen:name字段的值长度,以字节为单位。返回值:正确:0

错误:SOCKET_ERROR(WSAGetLastError)功能:将本地地址绑定到所创建的套接字上以在网络上标识该套接字。关于bind函数的几点说明地址种类常规地址:特定主机地址,特定端口号通配地址:INADDR_ANY,0进程指定结果IP地址端口通配地址0内核选择IP和端口通配地址非0内核选择IP,进程指定端口本地IP地址0进程指定IP,内核选择端口本地IP地址非0进程指定IP和端口When?client端的socket是否需要关联本地地址的?不建议connectsendto如果由系统选择地址或端口,如何获得套接字的双方地址?Getsockname函数:获得本地与套接字关联的IP地址和端口号Getpeername函数:获得通信对等端与套接字关联的IP地址和端口号关于bind函数的几点说明③监听连接——listen功能: 把一个未连接的套接字转换成一个被动套接字;规定了内核相应套接字排队的最大连接个数。函数定义:intlisten(SOCKETs,intbacklog)输入参数:

S:一个本地已建立的、尚未连接的套接字标识;

backlog:表示请求队列的最大长度;返回值:正确:0

错误:SOCKET_ERROR操作系统Web服务器2.bind(80)801.socket()3.listen()Listenqueue服务器初始化未完成连接队列(SYN_RCVD状态)已完成连接队列(ESTABLISHED状态)服务器TCP到达的SYN分节三次握手完成accept两队列之和不超过backlogSYN,SEQ=x客户进程服务器进程(主动打开)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDSYN,ACK,SEQ=y,ACK=x+1ACK,SEQ=x+1,ACK=y+1SYN_RCVDESTABLISHED④建立套接字连接★

客户机端——connect()函数定义:intconnect(SOCKETs,structsockaddrFAR*name,intnamelen)输入参数:

s:本地套接字标识

name:要建立连接的远地地址和端口

namelen:指明name的长度返回值:正确:0

错误:SOCKET_ERROROS1.socket()Web服务器2.bind(80)3.listen()80Listenqueue客户connect()Requestfrom(IP,port)建立与服务器的连接关于connect函数的几点说明connect函数完成的功能:注册服务器地址与远地服务器建立连接通过connect成功建立连接:服务器存在路径可达返回值分析阻塞套接字:返回值表示连接是否成功;非阻塞套接字:返回SOCKET_ERROR,且错误号为WSAEWOULDBLOCK时,表示连接不能立即完成。Connect函数常见的若干错误ETIMEDOUT错误:若TCP客户重发几次SYN请求后仍然没有收到SYN分节的响应。ECONNREFUSED错误:若服务器对客户的SYN响应是RST,表示该服务器主机在客户端指定的端口上没有进程提供服务。EHOSTUNREACH错误或ENETUNREACH错误:客户端发出SYN后收到ICMP目的不可达报文,在重试若干次后无效。注意:若connect失败,则套接口不再可用,必须关闭,再次调用connect函数是无效的。关于connect函数的几点说明操作系统Web服务器80Listen队列客户1客户3客户2客户请求在listen队列中获取先进先出服务(排队)服务器忙④建立套接字连接★

服务器端——accept()功能:服务器端调用该函数接收客户进程的连接。函数定义:SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)输入参数:s:本地套接字标识addr:存放客户进程的地址和端口号addrlen:指明addr的长度返回值:用于与当前客户进程通信的新套接字的标识,这个套接字与原有套接字的特性相同。说明:必须在listen之后调用。操作系统Web服务器80Listen队列客户1客户3客户2客户请求在listen队列中夺取先进先出服务accept()已连接的socketaccept()调用

accept函数的执行情况阻塞套接字当连接队列上没有等待的连接,accept进入阻塞状态非阻塞套接字当连接队列上没有等待的连接,accept返回错误WSAEWOULDBLOCK⑤数据传输——send和recv★

发送数据——send函数定义:intsend(SOCKETs,constcharFAR*buf,intlen,intflags)输入参数:

s:套接字标识

buf:存放发送数据的缓冲区

len:发送数据的字节总数

flags:对发送数据的处理方式

MSG_DONTROUTE:不要路由,MSG_OOB:带外数据返回值:成功:发送的字节总数失败:SOCKET_ERROR数据发送给谁?关于send函数的几点说明使用场合流式套接字已建立连接的数据报套接字发送长度<套接字允许的最大长度相关错误:如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。问题1:发送成功是否意味着数据传送到达?否问题2:在SOCKE_STREAM中,send函数如何获知数据的目的主机地址?Server:accept函数获得对方地址Client:connect函数注册对方地址问题3:如果传送数据的缓存区空间不够保存需传送的数据,如何处理?阻塞模式:等待非阻塞模式:实际写的数据可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。通过异步处理确定何时能够进一步发送数据关于send函数的几点说明关于send函数的几点说明问题4:根据数据长度、网络允许最大长度和系统缓存的情况,实际返回的发送长度有哪些情况?

设待发送的数据长度为X,实际发送的字节总数为X’,分以下几种情况讨论:1)X>最大长度:error2)Sysbufsize<X<最大长度:阻塞模式:等待,成功发送后X’=X非阻塞模式:X’=min{本地系统缓存大小,远端系统缓存大小}3)X<sysbuf:X’=X★

接收数据——recv函数定义:intrecv(SOCKETs,charFAR*buf,intlen,intflags)输入参数:

s:套接字标识

buf:接收数据的缓冲区

len:指明buf的字节数

flags:指定处理数据的方式;

MSG_OOB:处理带外数据;MSG_PEEK:保留数据返回值:

成功:接收的字节总数 失败:SOCKET_ERROR⑤数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论