您好,登錄后才能下訂單哦!
這篇文章跟大家分析一下“如何分析Linux系統中的socket編程”。內容詳細易懂,對“如何分析Linux系統中的socket編程”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠對大家有所幫助。下面跟著小編一起深入學習“如何分析Linux系統中的socket編程”的知識吧。
socket 是計算機網絡中用于在節點內發送或接收數據的內部端點。具體來說,它是網絡軟件 (協議棧) 中這個端點的一種表示,包含通信協議、目標地址、狀態等,是系統資源的一種形式。
它在網絡中所處的位置大致就是下面的黑色部分,應用層與傳輸層之間。
其中的傳輸層就是 TCP/IP 所在的地方,而你平時通過代碼編寫的應用程序大多屬于應用層范疇,socket 在這里起到就是連接應用層與傳輸層的作用。
socket 的誕生是為了應用程序能夠更方便的將數據經由傳輸層來傳輸,所以它本質上就是對 TCP/IP 的運用進行了一層封裝,然后應用程序直接調用 socket API 即可進行通信。那么它是如何工作的呢?它分為 2 個部分,服務端需要建立 socket 來監聽指定的地址,然后等待客戶端來連接。而客戶端則需要建立 socket 并與服務端的 socket 地址進行連接。
經過前面的client端的學習,我們已經知道了如何創建socket,所以接下來就是去綁定他到具體的一個端口上去。
綁定socket到一個端口上去
bind()函數可以將socket綁定一個端口上,client可以通過這個端口發起請求,端口對應的socket便會與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); } //監聽服務器自身 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))對于socket綁定到一個明確的端口上,我們接下來要做的就是接受這個端口下面的所有數據。。通過上面的實現,我們可以看出一個端口只能被一個socket使用。監聽端口:在綁定完成socket與端口之后,我們還需要去監聽端口。為此,我們需要將socket設置在被監聽的狀態。listen()將被用來將socket設置為被監聽的模式下。listen( socket_desc, 3);listen(int sockfd,int backlog);可以將socket處于監聽的狀態下接收請求建立連接: #include #include #include #include int main() { int sock_desc,new_socket,sockaddr_size; struct sockaddr_in server,client; //創建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))運行上述代碼:輸出:waiting for incoming connecions.現在代碼已經正常跑起來了,并且等待請求連接。在另外一個終端內,我們發起一個請求:teltnet 127.0.0.1 8888在當前這個終端內將會輸出:trying 127.0.0.1connected to loaclhost。Escape character is ;;connection closed by foreign host同時在之前的終端中,server會輸出:waiting for incoming connecions.connection accepted便可以看到,server已經正確接收了client的連接請求并建立了連接,只是沒有了后續操作,主機緊接著關閉了這個鏈接。連接建立之后便可以順利地進行雙方的通信,這部分的send與recv操作完全一樣。另外, 服務端獲取客戶端的ip地址:由前面能夠知道accept()返回的是結構體sockaddr_in ,由此很容易得知client的ip和端口信息。** ** char * client_ip = inet_ntoa(client.sin_addr);``int` `client_port = ntohs(client.sin_port);以上就是良許教程網為各位朋友分享的Linux系統相關內容。想要了解更多Linux相關知識記得關注公眾號“良許Linux”,或掃描下方二維碼進行關注,更多干貨等著你!
關于如何分析Linux系統中的socket編程就分享到這里啦,希望上述內容能夠讓大家有所提升。如果想要學習更多知識,請大家多多留意小編的更新。謝謝大家關注一下億速云網站!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。