巢穴

about:blank

第4章 基本TCP套接口编程

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,以选择所给定的familytype组合的系统缺省值

 

 

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)

 

EHOSTUNREACHENETUNREACH错误

在发出SYN分节的中间某个路由器引发了目的地不可达的ICMP错误,客户主机保存该消息,但仍然继续发送SYN,直到75秒后,如果仍未有回应,则把错误消息返回给进程。

以下情况也会产生此类错误

1.本地系统的转发表,根本没有到达远地系统的路径

2.connect调用根本不等待就返回(非阻塞?)

 

:connect失败则该套接口不再可用,必须关闭。

 

 

bind(int sockfd,                  const struct sockaddr *myaddr,               socklen_t addrlen);

0-成功,-1失败

     要绑定的套接口描述字       指向描述要绑定的套接口地址的结构指针         指向套接口地址的结构大小

 

如果一个TCP客户端或服务器未曾调用bind捆绑一个端口,当调用connectlisten时,内核会为相应的套接口选择一个临时端口

进程可把特定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排队,最大数据量为相应的已连接套接口的接受缓冲区大小。

posted on 2010-12-16 11:36 Vincent 阅读(287) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理