溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Linux系統(tǒng)中的socket編程

發(fā)布時(shí)間:2022-01-25 11:51:17 來(lái)源:億速云 閱讀:149 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這篇文章跟大家分析一下“如何分析Linux系統(tǒng)中的socket編程”。內(nèi)容詳細(xì)易懂,對(duì)“如何分析Linux系統(tǒng)中的socket編程”感興趣的朋友可以跟著小編的思路慢慢深入來(lái)閱讀一下,希望閱讀后能夠?qū)Υ蠹矣兴鶐椭O旅娓【幰黄鹕钊雽W(xué)習(xí)“如何分析Linux系統(tǒng)中的socket編程”的知識(shí)吧。

socket簡(jiǎn)介:

socket 是計(jì)算機(jī)網(wǎng)絡(luò)中用于在節(jié)點(diǎn)內(nèi)發(fā)送或接收數(shù)據(jù)的內(nèi)部端點(diǎn)。具體來(lái)說(shuō),它是網(wǎng)絡(luò)軟件 (協(xié)議棧) 中這個(gè)端點(diǎn)的一種表示,包含通信協(xié)議、目標(biāo)地址、狀態(tài)等,是系統(tǒng)資源的一種形式。

它在網(wǎng)絡(luò)中所處的位置大致就是下面的黑色部分,應(yīng)用層與傳輸層之間。

如何分析Linux系統(tǒng)中的socket編程如何分析Linux系統(tǒng)中的socket編程

其中的傳輸層就是 TCP/IP 所在的地方,而你平時(shí)通過(guò)代碼編寫的應(yīng)用程序大多屬于應(yīng)用層范疇,socket 在這里起到就是連接應(yīng)用層與傳輸層的作用。

socket 的誕生是為了應(yīng)用程序能夠更方便的將數(shù)據(jù)經(jīng)由傳輸層來(lái)傳輸,所以它本質(zhì)上就是對(duì) TCP/IP 的運(yùn)用進(jìn)行了一層封裝,然后應(yīng)用程序直接調(diào)用 socket API 即可進(jìn)行通信。那么它是如何工作的呢?它分為 2 個(gè)部分,服務(wù)端需要建立 socket 來(lái)監(jiān)聽(tīng)指定的地址,然后等待客戶端來(lái)連接。而客戶端則需要建立 socket 并與服務(wù)端的 socket 地址進(jìn)行連接。

server端的簡(jiǎn)單示例:

經(jīng)過(guò)前面的client端的學(xué)習(xí),我們已經(jīng)知道了如何創(chuàng)建socket,所以接下來(lái)就是去綁定他到具體的一個(gè)端口上去。

綁定socket到一個(gè)端口上去

bind()函數(shù)可以將socket綁定一個(gè)端口上,client可以通過(guò)這個(gè)端口發(fā)起請(qǐng)求,端口對(duì)應(yīng)的socket便會(huì)與client端的socket連接。

 #include #include #include #include #Include
 
 int main()
 {
 int socket_desc;
 struct sockaddr_in server;
 
 socket_desc = socket(AF_INET,SOCK_STREAM,0);
 if(-1==socket_desc)
 {
 perror("socket create error\n");
 exit(1);
 }
 
 //監(jiān)聽(tīng)服務(wù)器自身
 
 server.sin_family=AF_INET;
 server.sin_port = htons(8888);
 server.sin_addr.s_addr = INADDR_ANY;
 
 //綁定到端口
 
 if(bind(socket_desc,(struct sockaddr* )&server,sizeof(server))對(duì)于socket綁定到一個(gè)明確的端口上,我們接下來(lái)要做的就是接受這個(gè)端口下面的所有數(shù)據(jù)。。通過(guò)上面的實(shí)現(xiàn),我們可以看出一個(gè)端口只能被一個(gè)socket使用。監(jiān)聽(tīng)端口:在綁定完成socket與端口之后,我們還需要去監(jiān)聽(tīng)端口。為此,我們需要將socket設(shè)置在被監(jiān)聽(tīng)的狀態(tài)。listen()將被用來(lái)將socket設(shè)置為被監(jiān)聽(tīng)的模式下。listen( socket_desc, 3);listen(int sockfd,int backlog);可以將socket處于監(jiān)聽(tīng)的狀態(tài)下接收請(qǐng)求建立連接: #include #include #include #include
 
 int main()
 {
 int sock_desc,new_socket,sockaddr_size;
 struct sockaddr_in server,client;
 
 //創(chuàng)建socket
 sock_desc = socket(AF_INET,SOCK_STREAM,0);
 if(-1==sock_desc)
 {
 perror("cannot create socket\n");
 exit(1);
 }
 
 server.sin_family = AF_INET;
 server.sin_port = htons(8888);
 server.sin_addr.s_addr = INADDR_ANY;
 
 //綁定
 
 if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))運(yùn)行上述代碼:輸出:waiting for incoming connecions.現(xiàn)在代碼已經(jīng)正常跑起來(lái)了,并且等待請(qǐng)求連接。在另外一個(gè)終端內(nèi),我們發(fā)起一個(gè)請(qǐng)求:teltnet 127.0.0.1 8888在當(dāng)前這個(gè)終端內(nèi)將會(huì)輸出:trying 127.0.0.1connected to loaclhost。Escape character is ;;connection closed by foreign host同時(shí)在之前的終端中,server會(huì)輸出:waiting for incoming connecions.connection accepted便可以看到,server已經(jīng)正確接收了client的連接請(qǐng)求并建立了連接,只是沒(méi)有了后續(xù)操作,主機(jī)緊接著關(guān)閉了這個(gè)鏈接。連接建立之后便可以順利地進(jìn)行雙方的通信,這部分的send與recv操作完全一樣。另外, 服務(wù)端獲取客戶端的ip地址:由前面能夠知道accept()返回的是結(jié)構(gòu)體sockaddr_in ,由此很容易得知client的ip和端口信息。** ** char * client_ip = inet_ntoa(client.sin_addr);``int` `client_port = ntohs(client.sin_port);以上就是良許教程網(wǎng)為各位朋友分享的Linux系統(tǒng)相關(guān)內(nèi)容。想要了解更多Linux相關(guān)知識(shí)記得關(guān)注公眾號(hào)“良許Linux”,或掃描下方二維碼進(jìn)行關(guān)注,更多干貨等著你!

關(guān)于如何分析Linux系統(tǒng)中的socket編程就分享到這里啦,希望上述內(nèi)容能夠讓大家有所提升。如果想要學(xué)習(xí)更多知識(shí),請(qǐng)大家多多留意小編的更新。謝謝大家關(guān)注一下億速云網(wǎng)站!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI