服务端仍然是按照如下顺序进行编写:
socket()//创建套接字;
bind()//分配套接字地址;
listen()//等待连接请求状态;
accept()//允许连接;
read()/write()//进行数据交换;
close()//断开连接;
需要注意我们在检测建立链接的客户端IP是否与设置的相同时没有做判别,将接收所有IP请求建立链接。下面我们看下详细解释:
func_detect_tcp_server_link(int fd): 检测 TCP 服务端连接状态的函数。它接受一个文件描述符 fd,通过调用 getsockopt 函数获取与该文件描述符相关的 TCP 连接信息,并判断连接状态是否为已建立(TCP_ESTABLISHED)。如果连接状态为已建立,则返回 0;否则返回-1。
func_create_tcp_server_listen(int *fd, unsigned int listen_port): 建立 TCP 服务端监听的函数。它接受一个指向监听文件描述符的指针 fd,以及监听的端口号 listen_port。函数首先创建一个套接字,并将其设置为非阻塞模式。然后,通过调用 bind 函数将套接字绑定到指定的端口上,并通过调用 listen 函数开始监听客户端请求。如果操作成功,返回 0;否则返回-1。
func_tcp_server_accept(int listen_fd, int *fd, char *ip): TCP 服务端与客户端建立连接的函数。它接受一个监听文件描述符 listen_fd,一个指向连接文件描述符的指针 fd,以及一个用于 IP 过滤的客户端 IP 地址 ip。函数通过调用 accept 函数接受客户端的连接请求,并检查建立连接的客户端 IP 是否与设置的 IP 相同。如果 IP 相同,将连接文件描述符赋值给 fd,并返回1;否则返回0。
func_tcp_server_receive(int fd, char *p_receive_buff, int count): TCP 服务端接收数据的函数。它接收一个连接文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及最大接收长度 count。函数通过调用 recv 函数接收数据,并返回实际接收到的数据长度。
func_tcp_server_send(int fd, char *p_send_buff, int count): TCP 服务端发送数据的函数。它接收一个连接文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,以及发送数据的长度 count。函数首先调用 func_detect_tcp_server_link 函数检测连接状态,如果连接已断开,则返回 -1。然后通过调用 write 函数将数据发送给客户端,并返回实际发送的数据长度。如果发送的数据长度与指定的长度不一致,表示发送过程中出现错误,返回-1。
func_close_tcp_server_listen(int listen_fd): TCP 服务端关闭监听的函数。它接收一个监听文件描述符 listen_fd,并调用 close 函数关闭监听。
func_close_tcp_server_link(int fd): TCP 服务端关闭连接的函数。它接收一个连接文件描述符fd。
tcp_client.c
func_detect_tcp_client_link(int fd): 检测 TCP 客户端连接状态的函数。它通过获取套接字的 TCP 状态信息,判断连接是否已经建立。如果连接状态为 TCP_ESTABLISHED(已建立连接),则返回 0;否则返回 -1。
func_create_tcp_client_link(int *fd, char *ip, unsigned int port): TCP 客户端与服务端建立连接的函数。它接受一个指向文件描述符的指针 fd,一个服务端 IP 地址字符串 ip,以及服务端端口号 port。函数首先创建一个套接字,然后设置服务器地址结构,尝试与服务端建立连接。如果连接成功,返回 0;连接失败返回 -1。
func_tcp_client_receive(int fd, char *p_receive_buff, int count): TCP 客户端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及最大接收长度 count。函数通过调用 recv 函数接收数据,并返回实际接收到的数据长度。
func_tcp_client_send(int fd, char *p_send_buff, int count): TCP 客户端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,以及发送数据长度 count。函数首先调用 func_detect_tcp_client_link 检测连接状态,如果连接断开,则返回 -1。否则,调用 write 函数发送数据,并返回实际发送的数据长度。
func_close_tcp_client_link(int fd): TCP 客户端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。
udp协议程序
udp_server.c
func_create_udp_server(int *fd, unsigned int listen_port): UDP 服务端创建监听文件描述符的函数。它接受一个指向文件描述符的指针 fd,以及 UDP 服务端监听的端口号 listen_port。函数首先创建一个套接字,然后将其设置为非阻塞模式。接下来,设置服务器地址结构并绑定套接字和端口。如果操作成功,返回 0;否则返回 -1。
func_udp_server_receive(int fd, char *p_receive_buff, int count, char *ip, unsigned int *port): UDP 服务端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,数据最大接收长度 count,以及用于存储客户端 IP 和端口号的变量 ip 和 port。函数通过调用 recvfrom 函数接收数据,并返回实际接收到的数据长度。同时,将客户端的 IP 和端口号存储到 ip 和 port 变量中。
func_udp_server_send(int fd, char *p_send_buff, int count, char *ip, unsigned int port): UDP 服务端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,发送数据长度 count,以及目标客户端的 IP 和端口号 ip 和 port。函数通过调用 sendto 函数将数据发送给指定的客户端。
func_close_udp_server(int fd): UDP 服务端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。
udp_client.c
func_create_udp_client_link(int *fd, char *ip, unsigned int port): UDP 客户端创建文件描述符的函数。它接受一个指向文件描述符的指针 fd,UDP 服务端的 IP 地址 ip,以及 UDP 服务端的端口号 port。函数首先创建一个套接字,然后将其设置为非阻塞模式。如果操作成功,返回 0;否则返回 -1。
func_udp_client_receive(int fd, char *p_receive_buff, int count): UDP 客户端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及数据最大接收长度 count。函数通过调用 recvfrom 函数接收数据,并返回实际接收到的数据长度。
func_udp_client_send(int fd, char *p_send_buff, int count, char *ip, unsigned int port): UDP 客户端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针。
p_send_buff发送数据长度 count,以及 UDP 服务端的 IP 和端口号 ip 和 port。函数通过调用 sendto 函数将数据发送给指定的服务端。
func_close_udp_client_link(int fd): UDP 客户端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。