1.分配一个套接口的描述字及其所用的资源
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
family | 选项 |
---|---|
AF_INET | IPv4协议 |
AF——INET6 | IPv6套接字 |
AF_LOCAL | Unix域协议 |
AF_ROUTE | 路由套接字 |
AF_KEY | 密钥套接字 |
type | 选项 |
---|---|
SOCK_STREAM | 字节流套接字 |
SOCK_DGRAM | 数据报套接字 |
SOCK_SEQPACKET | 有序分组套接字 |
SOCK_RAW | 原始套接字 |
protocol | 选项 |
---|---|
IPPROTO_TCP | TCP传输协议 |
IPPROTO_UDP | UDP传输协议 |
IPPROTO_SCTP | SCTP传输协议 |
2.把本地协议地址给与一个套接字
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
bind函数可以指定端口号或者IP,或者两个都指定,也可以都不指定
端口对于bind:
j没有绑定端口,以后客户端执行connect或者服务端执行listen时候,内核会指定特定的端口。让内核给客户程序选择端口算正常,但是这样一个”随意的端口”对于服务器很糟糕,因为服务器是通过他们自己有名的端口来工作的。
IP对于bind :
绑定IP,对于客户程序,相当于在该套接字上发送的IP数据报指定源IP地址。对于服务器程序,相当于值接收那些以该IP为目的地址的连接请求。不绑定IP,对于客户程序,根据外出网络接口选择源IP,如果是服务器程序,内核把客户程序发送的SYN的目的地值IP作为服务器源地址IP。
由于bind第二个参数是const类型,因此在没有指定端口情况下,内核也没有办法通过bind函数返回端口值,为了得到这个临时端口值,要用getsockname函数来得到协议地址:
- 1
- 2
- 1
- 2
3.把套接字转换成被动套接字,并且为内核规定相应套接字排队的最大排队数。
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
4 开始接纳客户请求。
- 1
- 2
- 1
- 2
5 TCP客户端在socket之后会建立和TCP服务器的连接
- 1
- 1
客户在调用connect前不必要调用bind函数,内核会确定源IP地址和临时端口。
connect会激发TCP三次握手的第一次,即客户程序发送SYN请求,服务器程序会在accept时候给客户端发送SYN和ACK,即第二次握手。
connect调用失败的原因如下:
1.TCP客户程序没有受到SYN分节的相应,返回ETIMEDOUT错误标识。
2.对客户程序的SYN相应RST,表明服务端指定端口没有进程在等待与客户程序连接,返回ECONNREFUSED错误标识。
3.客户发出的SYN在路由过程中产生路由不可达并返回给客户,客户在一定事件之后返回EHOSTUNREACH或者ENETUNREACH标识。
6.万事大吉,开始收工。
- 1
- 1
close默认操作是把sockfd标记成已关闭,然后立刻返回到调用进程。并且调用进程不能再使用这个表述符。