TCP--IP详解之二(基本框架函数)

1.        Socket

1.1.       失败返回-1.成功返回相应的描述符。在描述符用尽的时候会失败。因此大并发的时候可能失败。

1.2.       协议AF_XXX,与PF_XXX是一样的。

1.3.       协议类型:AF_INET,AF_INET6,AF_LOCAL(AF_UNIX),AR_ROUTE,AF_UNSPEC.

1.4.       套接口类型:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW

2.        Connect

2.1.       成功0,失败-1.

一旦调用connect就会从CLOSED进入SYN_SEND状态。返回时,如果连接成功则变为ESTABLISHED。否则

2.2.       TCP引发三次握手。

2.2.1.1.      SYN没响应,返回ETIMEOUT.

2.2.1.2.      如果响应为RST,则为硬错误。直接返回ECONNREFUSED

RST响应的三种场景:SYN到达,但没有端口侦听,如上;TCP想取消一个连接;TCP接收到一个不存在的连接上的分节。

2.2.1.3.      如果中间路由引发ICMP错误,则为软错误。一般会按一的重试机制重试,如果仍然不通,则返回主机不可达错误。EHOSTUNREACH或ENETUNREACH。

2.2.1.4.      如果失败,则套接口不能再用,必须关闭,重新socket创建新的描述符。

2.3.       UDP也可以connect

2.3.1.      UDP上connect只是设置远程ip和端口。

2.3.2.      Connect可以修改远程的地址,因此一个UDP描述符可以和多个UDP服务器通信,但同一时刻只能跟一个地址(可以是广播地址)。断开连接使用AF_UNSPEC域。

2.3.3.      调用connect后的UDP称为已连接UDP,否则称为未连接UDP。

区别:已连接的则只能用和TCP相同的读写函数read,write,用sendto则不能再指定地址;已连接的UDP,内核只返回该地址的数据给UDP描述符;已连接的则可以得到异步错误,未连接的则不会得到异步错误。

2.3.4.      如果需要往一个地址发送多个包,则UDP也最好调用connect,这样可以提高性能,防止每次read,write都拷贝地址。

3.        Bind

Bind的真正含义是给socket描述符绑定一个本地的接口ip或(和)端口。因此一般来说服务器必须要bind,客户可以不绑定。但是服务器也可以不绑定,只是这样系统将随机选择端口,对外无法提供固定端口;客户端也可以绑定,这样就可以使用固定的端口连接服务器。

3.1.       Bind时如果端口为0,则会选择一个临时端口,相当于不指定端口。

3.2.       Bind时如果指定通配地址,则只有客户连接进来的时候才会选择本地地址。

3.3.       Bind失败一般为:EADDRINUSE;可以设置SO_REUSEADD或SO_REUSEPORT来修改行为。

4.        Listen

修改socket的类型。将主动套接口修改为被动套接口,内核应接收指向该套接口的连接请求。套接口进入LISTEN状态。

4.1.       内核为socket维护两个队列。未完成连接队列,三次握手没完成的,处于SYN_RECD状态;已连接队列,完成三次握手,处于ESTABLISHED状态。

5.        Accept

从已连接队列头部取出连接。

5.1.       Accept默认为阻塞的,即如果队列为空,则调用阻塞。可以修改为非阻塞的。

5.2.       Accept可以返回客户端的地址信息。也可以通过调用getpeername获取远端地址信息。

5.3.       本地地址可以使用getsockname获取。但UDP不能用getsockname。UDP需要先设置IP_RECVDSTADDR,再调用recvmsg获取。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值