TCP网络通信程序的流程
(2010-05-01 20:53:38)
调用socket创建一个套接字,函数bind将这个套接字与服务器公认地址绑定在一起,函数listen将这个套接字转换成倾听套接字(listening socket),然后调用函数accept来接受客户机的请求。在通信的另外一端,客户机调用函数socket创建一个套接字,然后调用函数connect来与服务器建立连接。连接建立之后,客户机与服务器通过读、写套接字来进行通信。如下图:
简单的TCP/IP交互过程
int socket(int domain,int type,int protocol);
参数domain指定要创建的套接字的协议簇地址类型,参数type指定套接字类型,参数protocol指定协议类型,通常设置为0,表示使用默认协议。如果函数执行发生异常,将返回值为-1的错误码,程序需要对这个返回值进行检查以保证程序的正常运行。下面介绍的connect、bind、accept、listen、recv、send等函数都是在发生错误的时候返回-1,程序必须对函数的返回值进行检查。
int connect(int sockfd,struct sockaddr *servaddr,int addrlen);
参数sockfd是函数socket返回的套接字描述符;参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号;参数addrlen指定这个套接字地址的长度。在程序中的调用方法实例如下:
struct addrinfo *si;
connect(sockfd,si->ai_addr,si->ai_addrlen);
int bind(int sockfd,struct sockaddr *myaddr,int addrlen);
参数sockfd是函数socket返回的套接字描述符;参数myaddr是本地地址;参数addrlen是套接字地址的长度。
int listen(int sockfd,int backlog);
参数sockfd是指定要转换的套接字描述符;参数backlog设置请求队列的最大长度,表示在accept函数之前同时最多有多少客户连接到这个套接字。
int accept(int sockfd,struct sockaddr *addr,int *addrlen);
参数sockfd是指定倾听套接字描述符;参数addr为指向一个套接字地址结构的指针;参数addrlen是地址数据的长度。函数的返回值也是一个套接字,程序可以用这个套接字与客户端进行通信。如果程序不需要继续接收客户端连接,可以用close函数关闭原来的倾听套接字。
int send(int sockfd,const void *buf,int len,int flags);
int recv(int sockfd,void *buf,int len,int flags);
参数sockfd指定读写操作的套接字描述符;参数buf指定数据缓冲区;参数len指定接收或发送数据量大小。参数flags一般可以设置为0。