tcp通信函数详解

来源:互联网 发布:四川网络推广托管 编辑:程序博客网 时间:2024/05/17 01:21

 服务器程序首先进行初始化操作:

调用socket创建一个套接字,函数bind将这个套接字与服务器公认地址绑定在一起,函数listen将这个套接字转换成倾听套接字(listening socket),然后调用函数accept来接受客户机的请求。在通信的另外一端,客户机调用函数socket创建一个套接字,然后调用函数connect来与服务器建立连接。连接建立之后,客户机与服务器通过读、写套接字来进行通信。如下图:

TCP网络通信程序的流程

简单的TCP/IP交互过程

    函数socket来用创建了套接字文件描述符。其定义如下:

int socket(int domain,int type,int protocol);

参数domain指定要创建的套接字的协议簇地址类型,参数type指定套接字类型,参数protocol指定协议类型,通常设置为0,表示使用默认协议。如果函数执行发生异常,将返回值为-1的错误码,程序需要对这个返回值进行检查以保证程序的正常运行。下面介绍的connect、bind、accept、listen、recv、send等函数都是在发生错误的时候返回-1,程序必须对函数的返回值进行检查。

    函数connect用来与其他主机建立连接,其定义如下:

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);

    函数bind将本地地址和端口与套接字绑定在一起,为等待其他主机连接做准备,其定义如下:

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

参数sockfd是函数socket返回的套接字描述符;参数myaddr是本地地址;参数addrlen是套接字地址的长度。

    函数listen将一个套接字转换为倾听套接字,对一个套接字调用了listen之后,客户端就可以连接了。listen函数的定义如下:

int listen(int sockfd,int backlog);

参数sockfd是指定要转换的套接字描述符;参数backlog设置请求队列的最大长度,表示在accept函数之前同时最多有多少客户连接到这个套接字。

    函数accept从倾听套接字的连接队列中接收一个连接,其定义如下:

int accept(int sockfd,struct sockaddr *addr,int *addrlen);

参数sockfd是指定倾听套接字描述符;参数addr为指向一个套接字地址结构的指针;参数addrlen是地址数据的长度。函数的返回值也是一个套接字,程序可以用这个套接字与客户端进行通信。如果程序不需要继续接收客户端连接,可以用close函数关闭原来的倾听套接字。

    当客户端与服务器建立连接之后,虽然可以通过函数read和write完成数据的通信,但对于socket通信来说,可以用send和recv系统调用更好的进行套接字操作。

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。

原创粉丝点击