1、TCP
1.1服务器
服务器流程:
-
启动
-
创建套接字(socket)
-
绑定(bind):绑定服务器的IP和端口
-
监听(listen):将套接字设置为被动监听状态
-
接受(accept):获取连接成功后的套接字
-
接收(recv):接收客户端的信息
-
发送(send):发送信息给客户端
-
关闭(close):关闭套接字
函数解析
1、创建套接字(socket)
名称 | socket |
---|---|
函数功能 | 创建一个套接字 |
原型 | int socket(int domain, int type, int protocol); |
头文件 | <sys/socket.h> |
参数 | domain :地址族,常见的有 AF_INET (IPv4)、AF_INET6 (IPv6)等 |
参数 | type :套接字类型,常见的有 SOCK_STREAM (流式套接字,提供面向连接、可靠的数据传输服务)、SOCK_DGRAM (数据报套接字,提供无连接、不可靠的数据传输服务)、SOCK_RAW (原始套接字,可以访问底层协议)等 |
参数 | protocol :协议,通常设为 0 让系统自动选择。如果指定协议,常见的有 IPPROTO_TCP (TCP 协议)、IPPROTO_UDP (UDP 协议)等 |
返回值 | 成功返回一个非负整数,表示套接字描述符;失败返回 -1 |
2、绑定(bind)
名称 | bind |
---|---|
函数功能 | 把一个本地协议地址赋予一个套接字 |
原型 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :要绑定的套接字描述符 |
参数 | addr :指向特定于协议的地址结构的指针 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回 0 ;失败返回 -1 |
3、设置监听状态(listen)
名称 | listen |
---|---|
函数功能 | 监听套接字上的连接请求 |
原型 | int listen(int sockfd, int backlog); |
头文件 | <sys/socket.h> |
参数 | sockfd :要监听的套接字描述符 |
参数 | backlog :指定内核为此套接字排队的最大连接个数 |
返回值 | 成功返回 0 ;失败返回 -1 |
4、获取连接成功的套接字(accept)
名称 | accept |
---|---|
函数功能 | 从已完成连接队列头返回下一个已完成连接,如果已完成连接队列为空,则进程被阻塞 |
原型 | int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | addr :用来返回连接对方的地址信息 |
参数 | addrlen :地址信息的长度 |
返回值 | 成功返回一个新的套接字描述符,用于和客户端通信;失败返回 -1 |
5、接收而客户端信息(recv)
名称 | recv |
---|---|
函数功能 | 从套接字接收数据 |
原型 | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
头文件 | <sys/socket.h> |
参数 | sockfd :接收数据的套接字描述符 |
参数 | buf :接收数据的缓冲区 |
参数 | len :要接收数据的最大长度 |
参数 | flags :指定接收数据的方式,通常设为 0 |
返回值 | 成功返回接收到的字节数;失败返回 -1 |
6、发送信息给客户端(send)
名称 | send |
---|---|
函数功能 | 通过套接字发送数据 |
原型 | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
头文件 | <sys/socket.h> |
参数 | sockfd :要发送数据的套接字描述符 |
参数 | buf :包含要发送数据的缓冲区 |
参数 | len :要发送数据的字节数 |
参数 | flags :控制发送数据的选项,通常设为 0 |
返回值 | 成功返回实际发送的字节数;失败返回 -1 |
7、关闭(close)
名称 | close |
---|---|
函数功能 | 关闭套接字 |
原型 | int close(int fd); |
头文件 | <unistd.h> |
参数 | fd :要关闭的文件描述符(包括套接字描述符) |
返回值 | 成功返回 0 ;失败返回 -1 |
1.2客户端
客户端流程:
-
创建套接字(socket)
-
绑定(bind)非必须
-
连接服务器(connect)
-
发送信息(send)
-
接收信息(recv)
函数解析
1、创建套接字(socket)
名称 | socket |
---|---|
函数功能 | 创建一个套接字 |
原型 | int socket(int domain, int type, int protocol); |
头文件 | <sys/socket.h> |
参数 | domain :地址族,常见的有 AF_INET (IPv4)、AF_INET6 (IPv6)等 |
参数 | type :套接字类型,常见的有 SOCK_STREAM (流式套接字,提供面向连接、可靠的数据传输服务)、SOCK_DGRAM (数据报套接字,提供无连接、不可靠的数据传输服务)、SOCK_RAW (原始套接字,可以访问底层协议)等 |
参数 | protocol :协议,通常设为 0 让系统自动选择。如果指定协议,常见的有 IPPROTO_TCP (TCP 协议)、IPPROTO_UDP (UDP 协议)等 |
返回值 | 成功返回一个非负整数,表示套接字描述符;失败返回 -1 |
2、绑定(bind)非必须
名称 | bind |
---|---|
函数功能 | 把一个本地协议地址赋予一个套接字 |
原型 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :要绑定的套接字描述符 |
参数 | addr :指向特定于协议的地址结构的指针 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回 0 ;失败返回 -1 |
3、连接服务器(connect)
名称 | connect |
---|---|
函数功能 | 建立与指定套接字的连接 |
原型 | int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | addr :指向要连接的服务器地址结构 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回 0 ;失败返回 -1 |
4、发送信息(send)
名称 | send |
---|---|
函数功能 | 通过套接字发送数据 |
原型 | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
头文件 | <sys/socket.h> |
参数 | sockfd :要发送数据的套接字描述符 |
参数 | buf :包含要发送数据的缓冲区 |
参数 | len :要发送数据的字节数 |
参数 | flags :控制发送数据的选项,通常设为 0 |
返回值 | 成功返回实际发送的字节数;失败返回 -1 |
5、接收信息(recv)
名称 | recv |
---|---|
函数功能 | 从套接字接收数据 |
原型 | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
头文件 | <sys/socket.h> |
参数 | sockfd :接收数据的套接字描述符 |
参数 | buf :接收数据的缓冲区 |
参数 | len :要接收数据的最大长度 |
参数 | flags :指定接收数据的方式,通常设为 0 |
返回值 | 成功返回接收到的字节数;失败返回 -1 |
2、UDP
2.1服务器端
服务器端流程
-
开始
-
创建套接字(socket)
-
绑定IP和端口(bind)
-
接收数据并获取对方信息(recvfrom)
-
发送数据要指定发送的人(sendto)
-
关闭套接字(close)
函数解析
1、创建套接字(socket)
名称 | socket |
---|---|
函数功能 | 创建一个套接字 |
原型 | int socket(int domain, int type, int protocol); |
头文件 | <sys/socket.h> |
参数 | domain :地址族,常见的有 AF_INET (IPv4)、AF_INET6 (IPv6)等 |
参数 | type :套接字类型,常见的有 SOCK_STREAM (流式套接字,提供面向连接、可靠的数据传输服务)、SOCK_DGRAM (数据报套接字,提供无连接、不可靠的数据传输服务)、SOCK_RAW (原始套接字,可以访问底层协议)等 |
参数 | protocol :协议,通常设为 0 让系统自动选择。如果指定协议,常见的有 IPPROTO_TCP (TCP 协议)、IPPROTO_UDP (UDP 协议)等 |
返回值 | 成功返回一个非负整数,表示套接字描述符;失败返回 -1 |
2、绑定IP和端口(bind)非必须
名称 | bind |
---|---|
函数功能 | 把一个本地协议地址赋予一个套接字 |
原型 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :要绑定的套接字描述符 |
参数 | addr :指向特定于协议的地址结构的指针 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回 0 ;失败返回 -1 |
3、接收数据并获取对方信息(recvfrom)
名称 | recvfrom |
---|---|
函数功能 | 从套接字接收数据,并获取数据的来源地址 |
原型 | ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | buf :接收数据的缓冲区 |
参数 | len :要接收数据的最大长度 |
参数 | flags :指定接收数据的方式,通常设为 0 |
参数 | src_addr :用于存储数据来源的地址结构 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回接收到的字节数;失败返回 -1 |
4、发送数据要指定发送的人(sendto)
名称 | sendto |
---|---|
函数功能 | 向指定的目的地址发送数据 |
原型 | ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | buf :包含要发送数据的缓冲区 |
参数 | len :要发送数据的字节数 |
参数 | flags :控制发送数据的选项,通常设为 0 |
参数 | dest_addr :目的地址结构 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回实际发送的字节数;失败返回 -1 |
5、关闭套接字(close)
名称 | close |
---|---|
函数功能 | 关闭套接字 |
原型 | int close(int fd); |
头文件 | <unistd.h> |
参数 | fd :要关闭的文件描述符(包括套接字描述符) |
返回值 | 成功返回 0 ;失败返回 -1 |
2.2客户端
2.2.1客户端流程
-
开始
-
创建套接字(socket)
-
绑定IP和端口(bind)非必须
-
发送数据要指定发送的人(sendto)
-
接收数据并获取对方信息(recvfrom)
-
关闭套接字(close)
2.2.2函数解析
1、创建套接字(socket)
名称 | socket |
---|---|
函数功能 | 创建一个套接字 |
原型 | int socket(int domain, int type, int protocol); |
头文件 | <sys/socket.h> |
参数 | domain :地址族,常见的有 AF_INET (IPv4)、AF_INET6 (IPv6)等 |
参数 | type :套接字类型,常见的有 SOCK_STREAM (流式套接字,提供面向连接、可靠的数据传输服务)、SOCK_DGRAM (数据报套接字,提供无连接、不可靠的数据传输服务)、SOCK_RAW (原始套接字,可以访问底层协议)等 |
参数 | protocol :协议,通常设为 0 让系统自动选择。如果指定协议,常见的有 IPPROTO_TCP (TCP 协议)、IPPROTO_UDP (UDP 协议)等 |
返回值 | 成功返回一个非负整数,表示套接字描述符;失败返回 -1 |
2、绑定IP和端口(bind)非必须
名称 | bind |
---|---|
函数功能 | 把一个本地协议地址赋予一个套接字 |
原型 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :要绑定的套接字描述符 |
参数 | addr :指向特定于协议的地址结构的指针 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回 0 ;失败返回 -1 |
3、发送数据要指定发送的人(sendto)
名称 | sendto |
---|---|
函数功能 | 向指定的目的地址发送数据 |
原型 | ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | buf :包含要发送数据的缓冲区 |
参数 | len :要发送数据的字节数 |
参数 | flags :控制发送数据的选项,通常设为 0 |
参数 | dest_addr :目的地址结构 |
参数 | addrlen :地址结构的长度 |
返回值 | 成功返回实际发送的字节数;失败返回 -1 |
4、接收数据并获取对方信息(recvfrom)
名称 | recvfrom |
---|---|
函数功能 | 从套接字接收数据,并获取数据的来源地址 |
原型 | ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
头文件 | <sys/socket.h> |
参数 | sockfd :套接字描述符 |
参数 | buf :接收数据的缓冲区 |
参数 | len :要接收数据的最大长度 |
参数 | flags :指定接收数据的方式,通常设为 0 |
参数 | src_addr :用于存储数据来源的地址结构 |
参数 | addrlen :地址结构的长度 |
返回值 |
5、关闭套接字(close)
名称 | close |
---|---|
函数功能 | 关闭套接字 |
原型 | int close(int fd); |
头文件 | <unistd.h> |
参数 | fd :要关闭的文件描述符(包括套接字描述符) |
返回值 | 成功返回 0 ;失败返回 -1 |