文档介绍:该【高级计算机网络编程AdvancedComputerNetwork 】是由【guwutang】上传分享,文档一共【22】页,该文档可以免费在线阅读,需要了解更多关于【高级计算机网络编程AdvancedComputerNetwork 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。基本TCP socket函数概述、TCP
connect/bind/listen/accept函数
TCP并发服务器例子
纲要
TCP套接口编程接口
#include <sys/>
int socket( int family, int type, int protocol);
/* 返回:整型套接口描述字—OK,-1—error*/
family 地址族
PF_XXX,AF_XXX
一套协议族多套地址族
实际只有一套 AF_XXX=PF_XXX
type SOCK_STREAM/DGRAM/SEQPACKET/RAW
Protocol
一般来说,函数socket的参数protocol设置为0
除非用在原始(raw)套接口上
socket函数
组合
族
connect函数
#include <sys/>
int connect(
int sockfd,
const struct sockaddr *servaddr,
socklen_t addrlen
);
返回 成功0 出错-1
==>TCP客户用connect函数来建立一个与TCP服务器的连接。
Connect 函数
可能返回的错误值
ETIMEOUT : SYN----无ACK响应:6—24 —75s重发syn
RST : 没有监听,收到不存在的连接,主动取消连接
EHOSTUNREACH : 主机不可达的ICMP错误(超过6跳以后)
ARP无响应、路由表无表项
非rst错误,自动重发处理
connect失败了也要close套接口
bind函数
#include <sys/>
int bind ( int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
返回: 0 成功, -1 出错
函数bind给套接口分配一个本地协议地址
32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合
在服务器启动时,要捆绑端口
如果TCP客户或服务器不这么做,当调用函数connect或listen时,内核就要为套接口选择一个临时端口。
让内核来选择临时端口,对TCP Client是正常,除非应用要求预留端口
对TCP Server来说是较少见的,因为服务器是通过它们的众所周知端口被大家认识的。
bind函数
bind函数
#include <sys/>
int bind ( int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
返回0 出错返回 -1
进程可以把一个特定的IP地址捆绑到它的套接口上,但此IP地址必须是主机的一个接口。对TCP Client,为发送数据确定了源IP;对TCP Server,限制了套接口接收目的IP为绑定地址的连接。
当套接口由内核根据所用输出接口选择源IP时,所用输出接口取决于到达服务器的路径;如TCP Server不把IP地址捆绑到套接口,内核就把客户所发数据所在分组的目的IP作为服务器源IP。
INADDR_ANY是IPv4的通配地址,值为0,通知内核选择IP地址。
进程指定
通配地址
listen 函数
函数listen仅被TCP服务器调用,做两件事情:
当函数socket创建套接口被假设为一个主动套接口,listen将其改为被动套接口;
函数第二个参数规定了内核为此套接口排队的最大连接个数。
建立tcp连接涉及的两个队列
收到syn创建未完成连接队列元素
收到ack创建完成连接队列元素