下图是一对 TCP 客户与服务器进程之间发生的一些典型事件的时间表。
[img]http://dl2.iteye.com/upload/attachment/0126/4398/db4635bf-090d-3dcf-acd5-6d218c467852.png[/img]
为执行网络 I/O,一个进程必须做的第一件事就是调用 socket 函数,指定期望的通信协议类型。
其中,family 参数指明协议族,type 参数指明套接字类型,protocol 参数为某个协议类型常值,或者设为 0,以选择所给定 family 和 type 组合的系统默认值。
下面各表分别给出了参数 family、type、protocol 及 family 和 type 的组合的值的情况。
[img]http://dl2.iteye.com/upload/attachment/0126/4400/51130f00-c3b1-3f9b-9de8-16092d13b14e.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0126/4402/de8236c6-d455-384b-abef-e0e8f2b54142.png[/img]
TCP 客户用 connect 函数来建立与 TCP 服务器的连接。
sockfd 是由 socket 函数返回的套接字描述符,第二个、第三个参数分别是一个指向包含有服务器的 IP 地址和端口号的套接字地址结构以及该结构的大小。
客户在调用 connect 前不必非得调用 bind 函数,因为如果需要的话,内核会确定源 IP 地址,并选择一个临时端口作为源端口。如果是 TCP 套接字,调用 connect 函数将触发 TCP 的三路握手过程,而且仅在建立成功或出错时才返回。其中出错返回可能有以下几种情况。
1、若 TCP 客户在一定的时间内没有收到 SYN 分节的响应,则返回 ETIMEDOUT 错误。
2、若对客户的 SYN 的响应是 RST(表示复位),则表明该服务器主机在所指定的端口上没有进程在等待与之连接(例如服务器进程也许没有运行)。这是一种硬错误(hard error),客户一接收到 RST 就马上返回 ECONNREFUSED 错误。一般产生 RST 的三个条件是:目的地为某端口的 SYN 到达,然而该端口上没有正在监听的服务器;TCP 想取消一个已有连接;TCP 接收到一个根本不存在的连接上的分节。
3、若客户发出的
[img]http://dl2.iteye.com/upload/attachment/0126/4398/db4635bf-090d-3dcf-acd5-6d218c467852.png[/img]
为执行网络 I/O,一个进程必须做的第一件事就是调用 socket 函数,指定期望的通信协议类型。
#include <sys/socket.h>
int socket(int family, int type, int protocol);
/* 返回:若成功,则为非负描述符;否则为 -1 */
其中,family 参数指明协议族,type 参数指明套接字类型,protocol 参数为某个协议类型常值,或者设为 0,以选择所给定 family 和 type 组合的系统默认值。
下面各表分别给出了参数 family、type、protocol 及 family 和 type 的组合的值的情况。
[img]http://dl2.iteye.com/upload/attachment/0126/4400/51130f00-c3b1-3f9b-9de8-16092d13b14e.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0126/4402/de8236c6-d455-384b-abef-e0e8f2b54142.png[/img]
TCP 客户用 connect 函数来建立与 TCP 服务器的连接。
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
/* 返回:若成功则为 0;否则为 -1 */
sockfd 是由 socket 函数返回的套接字描述符,第二个、第三个参数分别是一个指向包含有服务器的 IP 地址和端口号的套接字地址结构以及该结构的大小。
客户在调用 connect 前不必非得调用 bind 函数,因为如果需要的话,内核会确定源 IP 地址,并选择一个临时端口作为源端口。如果是 TCP 套接字,调用 connect 函数将触发 TCP 的三路握手过程,而且仅在建立成功或出错时才返回。其中出错返回可能有以下几种情况。
1、若 TCP 客户在一定的时间内没有收到 SYN 分节的响应,则返回 ETIMEDOUT 错误。
2、若对客户的 SYN 的响应是 RST(表示复位),则表明该服务器主机在所指定的端口上没有进程在等待与之连接(例如服务器进程也许没有运行)。这是一种硬错误(hard error),客户一接收到 RST 就马上返回 ECONNREFUSED 错误。一般产生 RST 的三个条件是:目的地为某端口的 SYN 到达,然而该端口上没有正在监听的服务器;TCP 想取消一个已有连接;TCP 接收到一个根本不存在的连接上的分节。
3、若客户发出的