注意:學習資料可在ElfBoard官方網站“資料”專區(qū)獲取。
本節(jié)用到的源碼路徑:ELF 1開發(fā)板資料包->03-例程源碼->03-1 命令行例程源碼->05_elf1_cmd_net
tcp協議程序
tcp_server.c
服務端仍然是按照如下順序進行編寫:
socket()//創(chuàng)建套接字;
bind()//分配套接字地址;
listen()//等待連接請求狀態(tài);
accept()//允許連接;
read()/write()//進行數據交換;
close()//斷開連接;
需要注意我們在檢測建立鏈接的客戶端IP是否與設置的相同時沒有做判別,將接收所有IP請求建立鏈接。下面我們看下詳細解釋:
func_detect_tcp_server_link(int fd): 檢測 TCP 服務端連接狀態(tài)的函數。它接受一個文件描述符 fd,通過調用 getsockopt 函數獲取與該文件描述符相關的 TCP 連接信息,并判斷連接狀態(tài)是否為已建立(TCP_ESTABLISHED)。如果連接狀態(tài)為已建立,則返回 0;否則返回-1。
func_create_tcp_server_listen(int *fd, unsigned int listen_port): 建立 TCP 服務端監(jiān)聽的函數。它接受一個指向監(jiān)聽文件描述符的指針 fd,以及監(jiān)聽的端口號 listen_port。函數首先創(chuàng)建一個套接字,并將其設置為非阻塞模式。然后,通過調用 bind 函數將套接字綁定到指定的端口上,并通過調用 listen 函數開始監(jiān)聽客戶端請求。如果操作成功,返回 0;否則返回-1。
func_tcp_server_accept(int listen_fd, int *fd, char *ip): TCP 服務端與客戶端建立連接的函數。它接受一個監(jiān)聽文件描述符 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,一個指向接收數據緩沖區(qū)的指針 p_receive_buff,以及最大接收長度 count。函數通過調用 recv 函數接收數據,并返回實際接收到的數據長度。
func_tcp_server_send(int fd, char *p_send_buff, int count): TCP 服務端發(fā)送數據的函數。它接收一個連接文件描述符 fd,一個指向發(fā)送數據緩沖區(qū)的指針 p_send_buff,以及發(fā)送數據的長度 count。函數首先調用 func_detect_tcp_server_link 函數檢測連接狀態(tài),如果連接已斷開,則返回 -1。然后通過調用 write 函數將數據發(fā)送給客戶端,并返回實際發(fā)送的數據長度。如果發(fā)送的數據長度與指定的長度不一致,表示發(fā)送過程中出現錯誤,返回-1。
func_close_tcp_server_listen(int listen_fd): TCP 服務端關閉監(jiān)聽的函數。它接收一個監(jiān)聽文件描述符 listen_fd,并調用 close 函數關閉監(jiān)聽。
func_close_tcp_server_link(int fd): TCP 服務端關閉連接的函數。它接收一個連接文件描述符fd。
tcp_client.c
func_detect_tcp_client_link(int fd): 檢測 TCP 客戶端連接狀態(tài)的函數。它通過獲取套接字的 TCP 狀態(tài)信息,判斷連接是否已經建立。如果連接狀態(tài)為 TCP_ESTABLISHED(已建立連接),則返回 0;否則返回 -1。
func_create_tcp_client_link(int *fd, char *ip, unsigned int port): TCP 客戶端與服務端建立連接的函數。它接受一個指向文件描述符的指針 fd,一個服務端 IP 地址字符串 ip,以及服務端端口號 port。函數首先創(chuàng)建一個套接字,然后設置服務器地址結構,嘗試與服務端建立連接。如果連接成功,返回 0;連接失敗返回 -1。
func_tcp_client_receive(int fd, char *p_receive_buff, int count): TCP 客戶端接收數據的函數。它接收一個文件描述符 fd,一個指向接收數據緩沖區(qū)的指針 p_receive_buff,以及最大接收長度 count。函數通過調用 recv 函數接收數據,并返回實際接收到的數據長度。
func_tcp_client_send(int fd, char *p_send_buff, int count): TCP 客戶端發(fā)送數據的函數。它接收一個文件描述符 fd,一個指向發(fā)送數據緩沖區(qū)的指針 p_send_buff,以及發(fā)送數據長度 count。函數首先調用 func_detect_tcp_client_link 檢測連接狀態(tài),如果連接斷開,則返回 -1。否則,調用 write 函數發(fā)送數據,并返回實際發(fā)送的數據長度。
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 服務端創(chuàng)建監(jiān)聽文件描述符的函數。它接受一個指向文件描述符的指針 fd,以及 UDP 服務端監(jiān)聽的端口號 listen_port。函數首先創(chuàng)建一個套接字,然后將其設置為非阻塞模式。接下來,設置服務器地址結構并綁定套接字和端口。如果操作成功,返回 0;否則返回 -1。
func_udp_server_receive(int fd, char *p_receive_buff, int count, char *ip, unsigned int *port): UDP 服務端接收數據的函數。它接收一個文件描述符 fd,一個指向接收數據緩沖區(qū)的指針 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 服務端發(fā)送數據的函數。它接收一個文件描述符 fd,一個指向發(fā)送數據緩沖區(qū)的指針 p_send_buff,發(fā)送數據長度 count,以及目標客戶端的 IP 和端口號 ip 和 port。函數通過調用 sendto 函數將數據發(fā)送給指定的客戶端。
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 客戶端創(chuàng)建文件描述符的函數。它接受一個指向文件描述符的指針 fd,UDP 服務端的 IP 地址 ip,以及 UDP 服務端的端口號 port。函數首先創(chuàng)建一個套接字,然后將其設置為非阻塞模式。如果操作成功,返回 0;否則返回 -1。
func_udp_client_receive(int fd, char *p_receive_buff, int count): UDP 客戶端接收數據的函數。它接收一個文件描述符 fd,一個指向接收數據緩沖區(qū)的指針 p_receive_buff,以及數據最大接收長度 count。函數通過調用 recvfrom 函數接收數據,并返回實際接收到的數據長度。
func_udp_client_send(int fd, char *p_send_buff, int count, char *ip, unsigned int port): UDP 客戶端發(fā)送數據的函數。它接收一個文件描述符 fd,一個指向發(fā)送數據緩沖區(qū)的指針。 ???????
p_send_buff發(fā)送數據長度 count,以及 UDP 服務端的 IP 和端口號 ip 和 port。函數通過調用 sendto 函數將數據發(fā)送給指定的服務端。
func_close_udp_client_link(int fd): UDP 客戶端關閉連接的函數。它接收一個文件描述符 fd,并調用 close 函數關閉連接。