linux網絡編程之Socket編程

(1)socket套接字

? ? ? ? ? ? ?1)在linux環境下,socket用于表示進程間網絡通信的特殊文件類型,其本質是內核借助緩沖區形成的偽文件(不占磁盤空間,除此之外還有二進制文件,管道,字符文件)。

? ? ? ? ? ? ?2)偽文件也可以像文件一樣的操作(讀寫),區別在于管道用于本地進程間的通信套接字多用于網絡進程間數據的傳遞。?

? ? ? ? ? ? ?3)在TCP/IP協議中,IP地址可以在網絡環境中唯一標識一個主機,端口號則在主機中唯一標識一個進程。因此在網絡中,IP地址+端口號就對應一個socket

? ? ? ? ? ? ?4)在網絡通信中,套接字一定成對存在。一段的發送緩沖區對應對端的接收緩沖區,使用同一個文件描述符可以操作發送緩沖區和接收緩存區。(全雙工,文件描述符一個,數據緩存區兩個

(2)網絡字節序

? ? ? ? ? ? ? 1)大端字節序:低地址高位、高地址低位

? ? ? ? ? ? ? ? ? ? 小端字節序:低地址低位,高地址高位(windows)

? ? ? ? ? ? ?2)網絡數據流地址規定:先發出的數據是低地址,后發出的數據是高地址。

? ? ? ? ? ? ? ? ? ?TCP/IP協議規定,網絡數據流采用大端字節序,即低地址高字節。

? ? ? ? ? ? ?3)為了保證網絡程序具有可移植性,需要調用庫函數做網絡字節序和主機字節序的轉換。?

? ? ? ? ? ? ? ? ? ? ? ? ? ? #include<arpa/inet.h>

? ? ? ? ? ? ? ? ? ? ? ? ? ?uint32_t? ?htonl(uint32_t? ?hostlong);? //host to net long? ?IP

? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_t? ?htons(uint16_t? ?hostshort);? //host to net short port?

? ? ? ? ? ? ? ? ? ? ? ? ? ?uint32_t? ?ntohl(uint32_t? ?netlong); //net? to host? long? IP?

? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_t? ?ntohl(uint16_t? ?netshort);? //net? to host? short port??

? ? ? ? ? ? ?如果主機是小端字節序,這些函數將參數做相應的大小端轉換后返回。如果主機是大端字節序,則不做轉換。

(3)IP地址轉換

? ? ? ? ? ? 1)通常我們所說的IP地址(如192.168.1.200),屬于點分十進制形式,而我們在網絡傳輸中通常使用到的是網絡字節序形式,因此在傳輸的過程中,首先需要把點分十進制形式的字符串轉換為網絡字節序格式。

? ? ? ? ? ? 2)IP地址轉換函數

? ? ? ? ? ? ? ? ? ? ? #include<arpa/inet.h>

? ? ? ? ? ? ? ? int? ? inet_pton(int af? ,const char *src, void *dst);//點分十進制字符串轉換為網路字節序

? ? ? ? ? ? ? ?const? char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//網絡字節序轉換為點分十進制

? ? ? ? ? ? ? ? 參數:af(IP地址格式):AF_INET(IPV4)? ? ? ? ? ? AF_INET6(IPV6)

? ? ? ? ? 3)sockaddr數據結構

? ? ? ? ? ? struct sockaddr誕生于IPV4協議時代,函數的接口通常使用(struct sockaddr),但是現在為了兼容IPV6,將struct sockaddr 改變成了struct sockaddr_t格式(因此現在定義變量時使用struct sockaddr_t,在傳參數時使用struct sockaddr(不能直接用這個定義變量)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

struct? sockaddr{? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? struct sockaddr_in{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct in_addr{

? ? ? ? ? sa_family_t? ? sa_family;? ? ? ? ? ??_kernel_sa_family_t? ? ?sin_family;? //地址結構類型? ? ? ? ? ? ? _be32 s_addr;IP地址

? ? ? ? ? char? sa_data[14];? ? ? ? ? ? ? ? ? ? ?_be16? ? ? ? ? ? ?sin_port;? ?//端口號? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };

};? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct? in_addr? sin_addr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?......

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };

?(4)Socket模型創建流程圖

? ? ? ? ? ? ? ? ?注:TCP客戶端沒有調用bind()函數綁定IP和端口號,系統會自動給它分配IP和端口號,但在TCP服務端則不能省去bind()函數。

? ? ? ? ?

(5)網絡套接字函數

? ? ? ? ? ? ? ? ? ?頭文件:#include<sys/types.h>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#include<sys/socket.h>

? ? ? ? ? ? 1)打開一個網絡通訊端口:socket函數(服務端、客戶端)

? ? ? ? ? ? ? ? ? ? ? int? ?socket(int domain, int type ,int protocol);

? ? ? ? ? ? ? ? ? ? ?參數:domain:協議類型,AF_INET(IPV4)? ?AF_INET6(IPV6)? ? ?AF_UNIX(本地協議)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?type:SOCK_STREAM(流失協議,默認為TCP傳輸)? ? ? ?SOCK_DGRAM(報式協議,默認使用UDP傳輸)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?protocol:使用默認協議

? ? ? ? ? ? ? ? ? ? 返回值:成功返回新創建socket的文件描述符,失敗返回-1.

? ? ? ? ?2)綁定IP和端口號:bind函數(服務端/客戶端)

? ? ? ? ? ? ? ? ? ? ? ?int? ?bind(int sockfd ,? const struct sockaddr *addr, socklen_t? addrlen);

? ? ? ? ? ? ? ?參數:sockfd : socket 文件描述符

? ? ? ? ? ? ? ? ? ? ? ? ? ?addr:綁定了IP和端口號的結構體

? ? ? ? ? ? ? ? ? ? ? ? ? addrlen:sizeof(addr)長度

? ? ? ? ? ? ? 返回值:成功返回0,失敗返回-1.

? ? ? ? 3)指定監聽上限數(同一時間允許多少客戶端和服務器連接):listen函數(服務端)

? ? ? ? ? ? ? int? ?listen(int? ?sockfd,? int? backlog)

? ? ? ? ? ? ? ? ? ?參數:backlog:排隊進行三次握手隊列和剛剛建立三次握手隊列的鏈接數和。

? ? ? ? ? ? ? ? ? ?返回值:成功返回0,失敗返回-1

? ? ? 4)接收連接請求:accept函數(服務端調用)

? ? ? ? ? ? int accept(int? sockfd,struct? sockaddr *addr,socklen_t *addrlen);

? ? ? ? ? ? ? ? ? 參數:addr(傳出參數)返回鏈接客戶端地址信息,含IP和端口號。

? ? ? 5)連接客戶端:connect函數(客戶端調用)

? ? ? ? ? ? int? ?connect(int? sockfd,const struct *sockaddr,socklen_t addrlen)

? ? ? ? ? ? ? ? ?參數:addr:傳入參數,指定服務器的地址信息,含IP地址和端口號。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?addrlen:sizeof(addr)大小

? ? ? ? ? ? ? ? 返回值:成功返回0,失敗返回-1.

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? addrlen(傳入傳出參數):傳入sizeof(addr)大小,函數返回真正接收到的地址結構體的大小。

? ? ? ? ? ? ? ? 返回值:生成一個新的socket文件描述符,用于和客戶端通信,失敗返回-1

(6) C/S模型之TCP:實現最簡單的客戶端、服務器程序

? ? ? ? ? ? ?服務器端:可通過命令nc? +自己ip +端口號完成自我通信(在不同進程使用)nc 182.168.1.100 6666

? ? ? ? ? ? ? ?

? ? ? ? ? ? 客戶端:

? ? ? ? ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux操作系統之簡易實現server/client

1.首先將出錯處理封裝成函數&#xff0c;具體封裝思想&#xff1a;是在底層函數的基礎上將首字母大寫&#xff08;方便在編程中查找函數文件的manpage,而不需要使用命令&#xff0c;直接用shiftk&#xff09;,然后調用底層庫函數并考慮出錯處理&#xff0c;具體函數如下&#x…

75. 顏色分類 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定義interface{},并實現sort.Interface接口的三個方法 ty…

linux網絡編程之TCP三次握手和四次揮手

1.在TCP連接的過程中&#xff0c;有三個階段&#xff0c;分別是建立連接&#xff0c;傳遞數據和斷開連接&#xff0c;通訊時序圖如下所示: 2.結合TCP數據報格式分析建立連接的三次握手 1&#xff09;首先客戶端發送一個帶有SYN標志的TCP報文給服務器端&#xff0c;詢問服務器端…

451. 根據字符出現頻率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定義排…

linux網路編程之多進程并發服務器

1&#xff09;使用多進程并發服務器考慮的因素&#xff1a; &#xff08;1&#xff09;父進程描述最大文件描述符的個數&#xff08;父進程需要關閉accept返回的新文件描述符&#xff09; &#xff08;2&#xff09;系統內可創建進程的個數&#xff08;與內存大小相關&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux網路編程之多線程并發服務器

1&#xff09;在使用進程模型開發服務器過程中考慮以下問題 &#xff08;1&#xff09;調整進程內最大文件描述符上限 &#xff08;2&#xff09;線程如有共享&#xff0c;考慮線程同步 &#xff08;3&#xff09;客戶端線程退出時&#xff0c;做退出處理&#xff08;線程分離&…

744. 尋找比目標字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 這個題答得很差勁&#xff0c;可能有點累 func nextGreatestLetter(letters []byte, target…

linux網路編程之TCP狀態轉換及端口復用

&#xff08;1&#xff09;TCP狀態轉換圖 其中圖中分為三種狀態&#xff1a;實線代表的主動發起連接&#xff0c;虛線代表的被動發起連接&#xff0c;細實線代表的可以雙向發起連接的狀態。 主動發起連接方狀態變化&#xff1a;1&#xff09;主動發起連接的一方發送SYN標志位&…

153. 尋找旋轉排序數組中的最小值 golang

153. 尋找旋轉排序數組中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux網絡編程之多路I/o轉接服務器select

(1)多路IO轉接服務器也叫做多任務IO服務器&#xff0c;其主要思想是不再由程序自己監聽客戶端連接&#xff0c;取而代之的是由內核替應用程序監視文件&#xff0c;具體實現模型如圖所示&#xff1a; 當客戶端請求和服務器連接時&#xff0c;內核接收到連接指令&#xff0c;告訴…

linux網絡編程之多路I/O轉接服務器poll函數

&#xff08;1&#xff09;poll函數 頭文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//監控的事件 short revents;//監控事件中滿足條件返回的事情 }&#xff1…

540. 有序數組中的單一元素 golang

540. 有序數組中的單一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++構造及析構順序及變量的生命周期

&#xff08;1&#xff09;變量的構造及析構順序 1&#xff09;在全局范圍內定義的對象&#xff08;即在所有函數之外定義的對象&#xff09;&#xff0c;它的構造函數在文件中的所有函數&#xff08;包括main函數&#xff09;執行之前調用。如果一個程序中有多個文件&#xff…

34. 在排序數組中查找元素的第一個和最后一個位置 golang

34. 在排序數組中查找元素的第一個和最后一個位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …

C/C++繼承與派生

&#xff08;1&#xff09;派生類的訪問屬性 1&#xff09;public繼承&#xff1a;派生類中&#xff1a;可以訪問基類的public和protect變量&#xff0c;不可以訪問基類的private變量 派生類外&#xff1a;可以訪問基類的public變量&#xff0c;不能訪問基類的private變量 2&am…

C/C++之string類小結

&#xff08;1&#xff09;C字符串和C字符串的轉換 C提供了三種方法可以將C字符串轉化為C字符串&#xff0c;分別是data(),c_str(),copy()成員函數來實現。 1&#xff09;data()是以字符數組的形式返回字符串內容&#xff0c;但并不添加‘\0’&#xff1b; 2&#xff09;c_str(…

2.兩數相加 golang

測試用例1500多個&#xff0c;考慮的情況非常多 測試用例 [0] [1] [2] [3,4,2] [5,0] [2] [1] [0] [9,8] [0] [4,6,5] [5,0] [1] [9] [0] [0,9] [2] [8,0,7] [0,1] [3] [0,1]func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {result : &List…

C/C++之vector的內存管理和效率

(1)vector容器支持隨機訪問&#xff0c;其內部是通過動態數組實現的&#xff1b; (2)當vector執行insert或者push_back時&#xff0c;如果此時動態數組的內存不夠用&#xff0c;則會重新分配當前大小的1.5~2倍的新內存區&#xff0c;把原來數組的內容復制過去&#xff1b; (3)為…

匯頂軟件開發初面總結20180921

博客參考&#xff1a;C中的多態和內部實現&#xff1a;https://www.cnblogs.com/qiaoconglovelife/p/5128523.html 虛函數表存放的地址&#xff1a;https://blog.csdn.net/jiary5201314/article/details/52627630 為什么STL和linux都采用紅黑樹作為平衡樹的實現&#xff1a;htt…