- 我最近開了幾個專欄,誠信互三!
====> |||《算法專欄》::刷題教程來自網站《代碼隨想錄》。|||
====> |||《C++專欄》::記錄我學習C++的經歷,看完你一定會有收獲。|||
====> |||《Linux專欄》::記錄我學習Linux的經歷,看完你一定會有收獲。|||
====> |||《C#專欄》::記錄我復習C#的經歷,深度理解,查漏補缺,不定期更新。|||
====> |||《計算機網絡專欄》::記錄我學習計算機網絡,看完你一定會有收獲。|||
Linux udp編程
- udp通信原理
- udp通信接口
- socket創建
- 網絡通信結構體
- bind port和ip
- 接收信息接口
- 發送信息接口
- 其他網絡接口
udp通信原理
udp是用戶數據報協議,不面向鏈接的不可靠傳輸。
udp協議使用socket進行通信,socket包含兩個部分:(ip-port),可以表示網絡中的某個主機和某個進程。
udp通信服務端建立如下
1).創建socket。
2).將socket和本地ip和port,bind。
3).使用recvfrom,sendto接口,接收,發送信息。
udp客戶端建立如下
1).創建socket。
2).本地隱式將sokcet和本地ip和port綁定。
3).使用recvfrom,sendto接口,接收,發送信息。
udp通信接口
支持udp通信接口較多。
socket創建
socket接口如下
參數1:domain,決定通信域,其接收一些宏,如AF_INET(ipv4),AF_INET(ipv6),同時也可以基于udp進行域間通信,還可以進行網絡管理,還可以跨網絡通信。
參數2:type,決定套接字通信類型,依舊接收一個宏,如SOCK_DGRAM,及代表數據報通信。
參數3:protocol,當前兩個參數決定后,該參數傳遞0。
retval:返回一個socket值,socket在底層是一個文件描述符,上層的進程就是通過該描述符通信的,類似于打開網卡。
當domain = AF_INET,type = SOCK_DGRAM代表udp通信。
網絡通信結構體
struct sockaddr,struct sockaddr_in,struct sockaddr_un。
sockaddr是父類接口,其他接口是子類接口,在使用的時候,我們都使用sockaddr_in/sockaddr_un,但是在使用參數的時候,為了保證可以通用一個接口,在接口參數設計的時候,都使用的是sockaddr。
1).sockaddr_in:用于網絡間通信,其結構體如下。
在該結構體中,存在sin_port,sin_addr(結構體),sin_family(指定通信域)。
bind port和ip
bind接口如下
參數1:sockfd,傳入一個sock文件描述符,代表綁定某個socket。
參數2:addr,傳入當地的,要綁定的ip和端口號,在服務端,sockaddr_in中,我們一般不綁定一個確定的ip,而通過宏INADDR_ANY,來代表當前主機。
參數3:addrlen,將參數2的大小算出,傳入其中。
retval:小于零,代表bind函數錯誤。
接收信息接口
recvfrom接口如下
參數1:sockfd,從那個sockfd中接收信息。
參數2:buf,將接收到的信息放入buf中。
參數3:len,代表buf中的有效個數。
參數4:flag,一般傳入0.
參數5:src_addr,為了能夠在接收信息后,知道信息的發送方,傳入一個輸出參數。
參數6:addrlen,該參數的類型是一個自定義類型,其實代表無符號整型,該參數就是傳入該類型的指針。
retval:返回收到的內容的字節數。
發送信息接口
sendto接口如下
參數1:sockfd,從那個sockfd中接收信息。
參數2:buf,將發送的信息放入buf中,發送出去。
參數3:len,代表buf中的有效個數。
參數4:flag,一般傳入0.
參數5:dest_addr,發送信息的目的sockaddr。
參數6:addrlen,其實代表無符號整型,直接傳入一個值。
其他網絡接口
在udp通信中還存在許多網絡接口,如網絡字節序轉換接口,ip字符串到4字節相互轉換接口,清空內存空間接口等等。
1).網絡字節序轉換接口
各個主機的字節序不同,有的主機是大端字節序,有的主機是小端字節序,為了確定內容在網絡中的傳遞,在網絡中傳遞的數據都是通過大端字節序傳遞的,所以在主機中,我們要通過網絡通信,就要將傳遞的結構體內容轉為大端。
2).ip字符串到4字節相互轉換接口
在客戶端,我們需要傳遞信息,就必須知道目的ip和port,需要將字符串ip轉換為32位數字ip,
存在以下接口
inet_aton接口,將點分十進制字符ip轉換為in_addr的4字節ip,返回值0,失敗,非0,成功。
接口inet_ntoa,將4字節ip轉換為字符串ip,該接口返回字符串的地址,該接口存在線程安全問題,該接口內部會在同一個靜態區創建一個字符串,并且返回它的地址,所以多線程并發訪問時,會造成線程安全問題。
3).清空內存空間接口
在使用struct sockaddr_in/struct sockaddr_un接口時,需要清空內存空間,就可以使用bzero接口。