第03章+基本TCP套接口编程.ppt
《第03章+基本TCP套接口编程.ppt》由会员分享,可在线阅读,更多相关《第03章+基本TCP套接口编程.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Tcp套接字编程TCP套接字编程(cont.)基本套接字函数socket#include int socket(int family,int type,int protocol)返回:非负套接字(sockfd)成功;-1出错。family:协议族;type:套接字类型;protocol:一般为0,除原始套接字外。family typeAF_INET IPv4协议SOCK_STREAM 字节流套接口AF_INET6IPv6协议SOCK_DGRAM 数据报套接口AF_LOCALunix域协议SOCK_RAW 原始套接口AF_ROUTE 路由套接口AF_KEY 密钥套接口Protocol:指明此so
2、cket请求所使用的协议,可以使用如下相关符号常数来表示。IPPROTO_TCP:表示TCP协议IPPROTO_UDP:表示UDP协议基本套接字函数bind#include int bind(int sockfd,const struct sockaddr*addr,socklen_len len)返回:0成功;-1出错并置errnon该函数指明套接字将使用本地的哪一个协议端口进行数据传送(IP地址和端口号),注意:协议地址addr是通用地址。nLen是该地址结构(第二个参数)的长度。n一般而言,服务器调用此函数,而客户则很少调用它。绑定地址时,可以指定地址和端口号,也可以指定其中之一,甚至一
3、个也不指定。通配地址:INADDR_ANY,其值一般为0,它通知内核选择IP地址。IP地址 端口 结果通配地址 0 内核选择IP地址和端口号通配地址 非0 内核选择IP地址,进程指定端口本地IP 0 进程指定IP地址,内核选择端口本地IP 非0 进程指定IP地址和端口号 若指定端口号为0,调用函数bind时,内核选择一个临时端口(在实际中,端口号都要指定);但若指定一个通配IP地址,则直到套接字已连接(TCP)或数据报已在套接字上发出(UDP),内核才选择一个本地IP地址。bind函数的用法struct sockaddr_in addr;int port=1234;int opt=SO_REU
4、SEADDR;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);bzero(&server,sizeof(server);addr.sin_family=AF_INET;addr.sin_addr.s_addr =htonl(INADDR_ANY);addr.sin_port=htons(port);if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)=-1)/*错误处理*/基本套接字函数listen#include int listen(int sockfd,int backlog)返回:0
5、成功;-1出错并置errno值;n函数listen仅被服务器调用,它完成两件事情:n函数listen将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求;n函数的第二个参数规定了内核为此套接字排队的最大连接个数;n对于给定的监听套接字,内核要维护两个队列n未完成连接队列n已完成连接队列n两个队列之和不超过backlog;客户服务器Connect调用在未完成队列建立条目SYN JSYN K,ack J+1ack K+1该条目从未完成队列移至已完成队列,accept阻塞Connect返回TCP三路握手和监听套接口的两个队列listen函数(续)三路握手完成两队列之和不能超过bac
6、klog已完成连接队列(ESTABLISHED状态)未完成连接队列(SYN_RCVD状态)新到达的SYN分节服务器TCPacceptTCPTCP为监听套接口维护的两个队列为监听套接口维护的两个队列listen函数(续)另外几点说明:n不同的实现对backlog有不同的解释,如源自Berkeley的实现将backlog增加一个模糊因子,把它乘以1.5,再作为两个队列之和;n不要把backlog定义为0,因为有些实现允许1个连接排队,而有些实现不允许有连接排队;n当一个客户SYN到达时,若两个队列都是满的,tcp就忽略此分节,且不发送RST。这是因为,这种情况是暂时的,客户tcp将重发SYN,期望
7、不久的将来就能在队列中找到空闲条目。n n如果发送如果发送RSTRST,将会出现?将会出现?基本套接字函数connect#include int connect(int sockfd,const struct sockaddr*addr,socklen_t addrlen);返回:0成功;-1出错;n函数connect激发TCP的三路握手过程;仅在成功或出错返回;错误有以下几种情况:n如果客户没有收到SYN分节的响应(总共75秒,这之间需要可能需要重发若干次SYN),则返回ETIMEDOUT。n如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连。函数返回错
8、误ECONNREFUSED;n如果客户发出的SYN在中间路由器上引发一个目的地不可达ICMP错误,客户上的内核保存此消息,并按第一种情况,连续发送SYN,直到规定时间,返回保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。基本套接字函数accept#include int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);返回:非负描述字(connfd)OK;-1出错;naccept函数由TCP服务器调用;从已完成连接队列头返回下一个已完成连接;如果该队列空,则进程进入睡眠状态
9、。n函数返回的套接字为已连接套接字,应与监听套接字区分开来n该函数最多返回三个值返回三个值:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由cliaddr所指),以及该地址的大小(这后两个参数是值结果参数);也就是说,服务器可以通过参数cliaddr来得到请求连接并获得成功的客户的地址和端口号;基本套接字函数close#include int close(int sockfd);返回:0OK;-1出错;nclose函数缺省功能是将套接字做上“已关闭”标记,并立即返回到进程。这个套接字不能再为该进程所用。n正常情况下,close将引发向TCP的四分节终止序列,但在终止前将发
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 03 基本 TCP 接口 编程
限制150内