TCP通信知识
- 使用TCP通信时常使用的函数和流程
1 | TCP服务端流程: TCP客户端流程: |
创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。
套接字由三个参数构成:IP地址,端口号,传输层协议。这三个参数用以区分不同应用程序进程间的网络通信与连接。
family指明了协议族/域,通常AF_INET、AF_INET6、AF_LOCAL等。AF_INET是IPv4协议,AF_INET6是IPv4协议;
type是套接口类型,主要SOCK_STREAM、SOCK_DGRAM、SOCK_RAW,SOCK_STREAM是TCP协议,SOCK_DGRAM是UDP协议;
客户端和服务端通用函数
int socket(int family, int type, int protocol)
(地址协议, 连接类型, 一般为0)
返回值:成功就返回新创建的套接字的描述符,失败返回-1;int recv( SOCKET s, char *buf, int len, int flags)
(套接字描述符, 存放接收数据的缓冲区, 该缓冲区长度, 0)
返回值:成功返回接收的字节数,为0则对方关闭了连接,失败返回-1,并设置errno;int send( SOCKET s, const char *buf, int len, int flags)
(套接字描述符, 存放发送数据的缓冲区, 发送数据的字节数, 0)
返回值:成功返回发送的字节数,为0则对方关闭了连接,失败返回-1,并设置errno;int close(int fd)
(fd为要关闭的文件描述符)
返回值:成功为0,失败返回-1,并设置errno;
客户端或服务端独有函数
int connect(int sockfd, const struct sockaddr *sockaddr, int addrlen)
(套接字描述符, 套接字地址结构的指针, 该结构的大小)
返回值:成功返回0,失败返回-1,并设置errno;int bind(int sockfd, const struct *server_addr, int addrlen)
(套接字描述符, 套接字地址结构的指针, 该结构的大小)
返回值:成功返回0,失败返回-1,并设置errno;int listen(int sockfd, int backlog)
(套接字描述符, 最大连接数)
返回值:成功返回0,失败返回-1,并设置errno;accept(SOCKET s, const struct sockaddr client_addr, int addrlen)
(套接字描述符, 套接字地址结构的指针, 指针类型该结构的大小)
返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,可以把它理解成是一个客户端的socket,这个socket包含的是客户端的ip和port信息 。(当然这个new_socket会从sockfd中继承 服务器的ip和port信息,两种都有了),而参数中的SOCKET s包含的是服务器的ip和port信息 。
Linux下服务端程序
1 | #include <sys/types.h> |
Linux下客户端程序
1 | #include <stdio.h> |