socket套接字介紹

2021-09-29 14:04:05 字數 3350 閱讀 4199

由於最近要完成自己的專案作業,其中需要使用socket進行網路通訊。所以簡單了解了一些這方面的知識,希望可以拋磚引玉。

socket 的原意是「插座」,在計算機通訊領域,socket 被翻譯為「套接字」,它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。我們把插頭插到插座上就能從電網獲得電力**,同樣,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而 socket 就是用來連線到網際網路的工具。

套接字(socket)是乙個抽象層,網路套接字是ip位址與埠的組合。學習 socket,也就是學習計算機之間如何通訊,並編寫出實用健壯的程式。

套接字有很多種類,而最具代表性的就是 internet 套接字,我們常說的套接字,如果沒有其他說明,都是指 internet 套接字。

根據資料的傳輸方式,可以將套接字分成兩種型別。流格式套接字(sock_stream)和資料報格式套接字(sock_dgram)。通過 socket() 函式建立連線時,必須告訴它使用哪種資料傳輸方式。

流格式套接字是基於tcp協議,tcp 協議會控制你的資料按照順序到達並且沒有錯誤。所以說流格式套接字是一種可靠的、雙向的通訊資料流。

流格式套接字有以下特徵:

資料在傳輸過程中不會消失;

資料是按照順序傳輸的;

資料的傳送和接收不是同步的

資料報格式套接字也是 ip 協議作路由,但是是依託udp協議。資料報套接字是一種不可靠的、不按順序傳遞的、以追求速度為目的的套接字。當資料傳輸發生錯誤時,也不會重傳。

資料報格式套接字有以下特徵:

強調快速傳輸而非傳輸順序;

傳輸的資料可能丟失也可能損毀;

限制每次傳輸的資料大小;

資料的傳送和接收是同步的。

socket是站在傳輸層的基礎上,所以可以使用 tcp/udp 協議,為了更好的了解socket,我們需要網路通訊協議知識的儲備,我把附件已經放在下面了,大家可以自取。至少要了解tcp/ip協議,關於tcp的三次握手(這也是面試常問的問題),

linux系統下比較簡單,我們實現乙個簡單的客戶端從伺服器讀取「hello world」並列印出來

伺服器:

#include

#include

#include

#include

#include

#include

#include

intmain()

客戶端:

#include

#include

#include

#include

#include

#include

intmain()

windows系統下就比較麻煩了,需要預先載入winsock.dll 或 ws2_32.dll檔案,而且windows跟linux所用的一些函式功能雖然相同,但是名稱卻是不同的,這個要注意一下。

伺服器:

#include

#include

#pragma comment (lib, "ws2_32.lib")

//載入 ws2_32.dll

intmain()

客戶端:

#include

#include

#include

#pragma comment(lib, "ws2_32.lib")

//載入 ws2_32.dll

intmain()

;recv

(sock, szbuffer, maxbyte,

null);

//輸出接收到的資料

printf

("message form server: %s\n"

, szbuffer)

;//關閉套接字

closesocket

(sock)

;//終止使用 dll

wsacleanup()

;system

("pause");

return0;

}

socket()函式在兩個平台下引數是相同的,不同的是返回值,大家可以參考上面的**。

先說一下linux系統下的socket()函式。在 linux系統下使用 標頭檔案中 socket() 函式來建立套接字,原型為:

int socket(int af, int type, int protocol);

af指的是位址族(address family),也就是ip位址型別。當然有時候也會使用pf,到時候見到就不用驚訝了。type指的是資料傳輸方式/套接字型別,我們在上面已經講了,根據資料傳輸方式的不同,我們可以將socket劃分為兩種常用型別,這裡指的就是這個。protocol 表示傳輸協議,常用的有 ipproto_tcp 和 ipptoto_udp,分別表示 tcp 傳輸協議和 udp 傳輸協議。

一般情況下有了 af 和 type 兩個引數就可以建立套接字了,作業系統會自動推演出協議型別,但是有時候有兩種不同的協議支援同一種位址型別和資料傳輸型別,這個時候我們就需要指定傳輸協議了。

引數 af 的值為 pf_inet。如果使用 sock_stream 傳輸資料,那麼滿足這兩個條件的協議只有 tcp,因此可以這樣來呼叫 socket() 函式:

int tcp_socket = socket(af_inet, sock_stream, ipproto_tcp);

這種套接字稱為 tcp 套接字。

如果使用 sock_dgram 傳輸方式,那麼滿足這兩個條件的協議只有 udp,因此可以這樣來呼叫 socket() 函式:

int udp_socket = socket(af_inet, sock_dgram, ipproto_udp);

這種套接字稱為 udp 套接字。

上面兩種情況都只有一種協議滿足條件,可以將 protocol 的值設為 0,系統會自動推演出應該使用什麼協議,如下所示:

int tcp_socket = socket(af_inet, sock_stream, 0);

int udp_socket = socket(af_inet, sock_dgram, 0);

windows平台下也是如此

socket socket(int af, int type, int protocol);

套接字 Socket 定義

套接字介面可分為三類 公認埠 註冊埠 動態和 或私有埠 套接字,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函式來完成通訊過程 應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要通過同乙個 tcp協議埠傳輸資料...

socket 套接字通訊

要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...

套接字(socket) 埠

套接字 socket socket可以看成在兩個程式進行通訊連線中的乙個端點,乙個程式將一段資訊寫入socket中,該socket將這段資訊傳送給另外乙個socket中,使這段資訊能傳送到其他程式中。套接字,是支援tcp ip的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,...