UNIX网络编程笔记
做下笔记,以供不时之需:)
第4章
socket(int family, int type, int protocol);
非负描述字-成功,-1-出错
协议族 套接口类型 协议类型常量值
AF_INET IPv4协议 SOCK_STREAM 字节流 IPPROTO_TCP TCP传输协议
AF_INET6 IPv6协议 SOCK_DGRAM 数据报 IPPROTO_UDP UDP传输协议
AF_LOCAL UNIX域协议 SOCK_SEQPACKET有序分组 IPPROTO_SCTP SCTP传输协议
AF_ROUTE 路由套接口 SOCK_RAW 原始套接口
AF_KEY 密钥套接口
protocol可以设为0,以选择所给定的family和type组合的系统缺省值
connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
要连接的套接口描述字 指向描述连接地址的套接口地址的结构指针 指向套接口地址的结构大小
0-成功,-1-失败
ETIMEDOUT错误,客户端未收到SYN分节的响应
在4.4BSD内核中SYN分节会在首次发出后的6秒,24秒后再发出SYN分节,如果75秒后仍无响应,返回错误(TCPv2 p828)
ECONNERFUSED错误,客户端收到RST分节时就返回错误
其中产生RST的三个条件是:
1.目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器
2.TCP想取消一个已有连接
3.TCP接受到一个根本不存在的连接上的分节(TCPv1 246-250)
EHOSTUNREACH或ENETUNREACH错误
在发出SYN分节的中间某个路由器引发了目的地不可达的ICMP错误,客户主机保存该消息,但仍然继续发送SYN,直到75秒后,如果仍未有回应,则把错误消息返回给进程。
以下情况也会产生此类错误
1.本地系统的转发表,根本没有到达远地系统的路径
2.connect调用根本不等待就返回(非阻塞?)
注:connect失败则该套接口不再可用,必须关闭。
bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
0-成功,-1失败
要绑定的套接口描述字 指向描述要绑定的套接口地址的结构指针 指向套接口地址的结构大小
如果一个TCP客户端或服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核会为相应的套接口选择一个临时端口
进程可把特定IP地址捆绑到它的套接口上,这个特定IP必须是主机的网络接口之一。对于TCP客户,这就限定了套接口只接受目的地为这个特定IP的客户连接。
TCP客户通过不把IP捆绑到它的套接口上,内核会根据所用外出网络接口来选择源IP地址,而所用外出的接口则取决于到达服务器所需的路径。(TCPv2 p737)
如果TCP服务器没有把IP地址捆绑到它的套接口上,内核就把客户发送的SYN的宿IP地址作为服务器的源地址。(TCPv2 p943)
EADDRINUSE错误 地址已使用
listen( int sockfd , int backlog);
0-成功,-1失败
要转换成被动的套接口 排队的最大已连接个数
1.未完成连接队列
处于SYN_RCVD状态的套接口队列
2.已完成连接队列
处于ESTABLISHED状态的套接口队列
在队列满时,服务器如果收到SYN分节,会忽略掉,因为队列满是暂时性的,忽略掉可以以期待客户端的再次连接。而如果返回RST分节,会时客户端放弃连接。
在三次握手完成之后,但在服务器调用accept之前到达的数据,应有服务器TCP排队,最大数据量为相应的已连接套接口的接受缓冲区大小。
Int accept( int sockfd, struct sockaddr* cliaddr, socklen_t* addrlen);
非负描述字-成功,-1-失败
被动的监听套接口 对端的套接口地址的结构 对端的套接口地址的结构大小
Int close(int sockfd);
0- 成功,-1-失败
要关闭的套接口
缺省行为是修改套接口标记为已关闭,函数会立即返回,此时该套接口描述字已不能再由进程使用。而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后开始正常的TCP连接终止序列。
SO_LINGER套接口选项可以改变此缺省行为。