互联网络程序设计第3章

互联网络程序设计第3章

ID:40183666

大小:1.08 MB

页数:32页

时间:2019-07-24

互联网络程序设计第3章_第1页
互联网络程序设计第3章_第2页
互联网络程序设计第3章_第3页
互联网络程序设计第3章_第4页
互联网络程序设计第3章_第5页
资源描述:

《互联网络程序设计第3章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第三章、迭代服务器与客户端TCP套接字编程基本步骤套接字编程基本函数迭代echo服务器迭代echo客户端测试用例1.TCP套接字编程基本步骤TCP套接字基本步骤分为服务器端和客户端两部分:服务器端创建套接字绑定套接字设置套接字为监听模式,进入被动接受连接状态接受请求,建立连接读写数据终止连接客户端步骤创建套接字与远程服务器建立连接读/写数据终止连接TCP套接字编程(cont.)socket()bind()listen()accept()read()write()close()socket()connect()w

2、rite()read()close()阻塞直到接收到客户连接请求TCP服务器端TCP客户端2.套接字编程基本函数bind函数#includeintbind(intsockfd,structsockaddr*addr,socklen_lenlen)返回:0-成功;-1-出错该函数用于给传输层的socket分配地址,其深层含义是在分用Packet的时候,协议栈通过检查inpcb中的地址,确定packet应该传送给哪个socket一般而言,服务器调用此函数,而客户则很少调用它。绑定地址时,

3、可以指定地址和端口号,也可以指定其中之一,甚至一个也不指定。通配地址:INADDR_ANYbind函数(续)另外,需要注意以下几点:参数addr中的相关字段在初始化时,必须是网络字节序;如果由内核来选择IP地址和临时端口号,函数并不返回所选择的值。为了获得这些值,进程必须调用getsockname函数函数bind返回的一个常见错误是:EADDRINUSE,我们可以通过设置套接口选项SO_REUSEADDR。IP地址端口结果通配地址0内核选择IP地址和端口号通配地址非0内核选择IP地址,进程指定端口本地IP0进程

4、指定IP地址,内核选择端口本地IP非0进程指定IP地址和端口号bind函数的用法…structsockaddr_inaddr;intport=1234;addr.sin_family=AF_INET;addr.sin_addr.s_addr=htonl(INADDR_ANY);addr.sin_port=htons(port);if(bind(fd,(structsockaddr*)&addr,sizeof(addr))==-1){/*错误处理*/}基本套接字函数-listen#include

5、et.h>intlisten(intsockfd,intbacklog)返回:0-成功;-1-出错;函数listen仅被服务器调用,它完成两件事情:函数listen将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求;函数的第二个参数规定了内核为此套接字排队的最大连接个数;对于给定的监听套接字,内核要维护两个队列未完成连接队列已完成连接队列两个队列之和不超过backlog;listen函数(续)三路握手完成两队列之和不能超过backlog已完成连接队列(ESTABLISHED状态)未完成连接队

6、列(SYN_RCVD状态)新到达的SYN分节服务器acceptTCP为监听套接口维护的两个队列ClientServerSocketConnect(blocks)(activeopen)Socket,bind,listen(passiveopen)SYNJSYNK,ackJ+1ackK+1AcceptreturnRead(blocks)Connectreturn连接完成,进入已建连队列RTTlisten函数(续)另外几点说明:不同的实现对backlog有不同的解释,如源自Berkeley的实现将backlog增加

7、一个模糊因子,把它乘以1.5,再作为两个队列之和;不要把backlog定义为0,因为有些实现允许1个连接排队,而有些实现不允许连接排队;当一个客户SYN到达时,若两个队列都是满的,tcp就忽略此分节,且不发送RST。这是因为,这种情况是暂时的,客户tcp将重发SYN,期望不久的将来就能在队列中找到空闲条目。如果发送RST,将会出现?基本套接字函数-accept#includeintaccept(intsockfd,structsockaddr*cliaddr,socklen_t*ad

8、drlen);返回:非负描述字-OK;-1-出错;accept函数由TCP服务器调用;从已完成连接队列头返回下一个已完成连接;如果该队列空,则进程进入睡眠状态。函数返回的套接字为连接套接字,应与监听套接字区分开来该函数最多返回三个值:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由cliaddr所指),以及该地址的大小(这后两个参数是值-结果参数);也就是说,服务

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。