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