Socket 程式設計簡介

2021-04-16 11:56:10 字數 2591 閱讀 8971

《linux 公報》……讓linux更富魅力!

譯者:小牟

大多數的網路應用程式可以分成兩部分:客戶端和伺服器端。

建立乙個socket

#include 

#include

當建立乙個socket時需要指定三個主要的引數:

int socket(int domain, int type, int protocol);
域引數指定了通訊存在的域範圍,在我們的例子中是af_inet,其指定了arpa internet 協議, 型別引數指定了通訊的語義,在這個迷你的對話程式中使用的流(stream)socket,型別(sock_stream), 其提供了雙向的、可靠的、基於位元組流的雙路連線(參考資料2)。最後是協議的型別,既然我們選擇的是 流socket型別,所以必須要選擇一種能夠提供面向連線的協議,譬如ip,故而我們決定選擇 的協議型別是ip,而且我們可以在 /etc/protocols 檢視到ip位址,0。現在我們這樣建立:

s = socket(af_inet , sock_stream , 0)
's'是socket功能返回的檔案描述符。

由於我們的迷你對話程式分成兩部分,所以在後面的內容中 將分開來解釋,並比較他們的不同之處。

繫結socket到埠等待接入

和所有的基於tcp/ip的網路服務一樣,socket 通常要與埠結合,正如telnet占用埠23, ftp占用的是21...在我們的伺服器中,我們也必須這麼做,繫結埠準備偵聽連線, (這就是客戶端和伺服器端的基本不同點),繫結用來指定socket守侯等待訊息進入的 協議埠。

問題出現了,我們在新服務上繫結哪個埠?系統預先定義了大量的埠,從1到7000 (/etc/services中列出部分占用的埠)。 我們選擇15000號埠。

bind函式說明:

int bind(int s, struct sockaddr *addr, int addrlen)
socket啟動的必要結構是sockaddr_in 位址;然後按下列出的內容向系統報告socket的資訊。

socket型別

address.sin_family = af_inet /* use a internet domain */

所用的ip位址

address.sin_addr.s_addr = inaddr_any /*use a specific ip of host*/

所用的埠

address.sin_port = htons(15000); /* use a specific port number */

緊接著繫結埠到socket

bind(create_socket , (struct sockaddr *)&address,sizeof(address));
另一重要的內容是,socket準備偵聽接收來自客戶端的資訊,listen功能用來在伺服器端 接收面向通訊的接入,接入數目也會受到限制(參考資料3)。

listen (create_socket, maxnumber)
我們設定的最大接入數目是3,作為最後的內容需要我們告訴伺服器使用accept()功能接收接入。 accept用於基於socket流連線。

accept(create_socket,(struct sockaddr *)&address,&addrlen);
正如我們在清單2中看到的,(create_socket)引數是主socket的描述符,緊接著的引數 是sockeaddr_in和結構大小(參考資料 3)

客戶端需要執行connect()功能,也許這是與伺服器的主要不同。connect操作用來在客戶端接入, 如有可能就開始連線到伺服器端。

connect(create_socket,(struct sockaddr *)&address,sizeof(address)) ;
客戶端和伺服器端的公共結構是在清單1和2中列出的。另外還有send和recv函式也是公共的**。

send()函式將緩衝區中的內容傳送到伺服器。

send(new_socket,buffer,bufsize,0);
而recv()函式用來接收伺服器中的內容並放到緩衝區,可以看到在客戶端和伺服器端都包含此函式。

recv(new_socket,buffer,bufsize,0);
執行伺服器端

在伺服器範圍內執行客戶端

很迷人吧,你認為如何?

這是我們的伺服器專案程式的開始部分,是乙個網路管理程式。以下列出的是源**:

operating systems , harvey m. deitel , 1990

socket linux man page

network functions in c - tutorial

internetworking with tcp/ip vol1 - doulgas commer

unix network programming , vol2 , richard stevens

unix network programming, vol1, richard stevens

Socket 程式設計簡介

linux 公報 讓linux更富魅力!譯者 小牟 大多數的網路應用程式可以分成兩部分 客戶端和伺服器端。建立乙個socket include include當建立乙個socket時需要指定三個主要的引數 int socket int domain,int type,int protocol 域引數...

Socket 程式設計簡介

本章節我們為大家接收 perl 語言中如何使用 socket 服務。下圖演示了客戶端與服務端之間的通訊流程 1 socket 函式 我們用 socket 函式來建立套接字,語法格式如下 socket socket,domain,type,protocol 引數解析 type套接字型別可以根據是面向連...

socket程式設計 01 socket簡介

在計算機通訊領域,socket 被翻譯為 套接字 它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。學習 socket,也就是學習計算機之間如何通訊,並編寫出實用的程式。計算機分布在世界各地,要想和它們通訊,必須...