socket網路程式設計複習筆記(四) 認識套接字函式

2021-07-06 05:25:17 字數 3640 閱讀 6689

在前面的內容中,我們知道了通訊的基本流程,在通訊過程中會用到很多套接字函式,諸如socket(),bind(),recv()等等。那麼我們在實際程式設計中,我們該如何正確使用套接字函式呢?

按照函式的功能不同,我們可以將大部分常用的套接字函式歸入到以下四類中:

通訊類:

socket();

bind();

listen();

accept();

connect();

recv();

send();

sendto();

recvfrom();

select();

shutdown();

closesocket();

控制類:

ioctlsocket();

setsockopt();

資訊類:

getpeername();

getsockname();

getsockopt();

輔助類:

htonl();

ntohl();

htons();

ntohs();

inet_addr();

inet_ntoa();

(1)socket socket(in int af,in int type,in int protocol)

其中,in表示引數的作用是作為輸入,out表示引數的作用是作為輸出。

af代表位址族型別,tcp/ip(internet)使用的位址族為af_inet。

type代表套接字型別,主要有以下幾類:

sock_stream:預設情況下使用tcp協議;

sock_dgram:預設情況下使用udp協議;

sock_ram:資料直接封裝在ip分組內。

protocol代表協議號,一般設定為0。

此函式功能為:建立乙個套介面結構,將其(套接字)描述符交給被呼叫者。

(2)int bind ( in socket s, in struct sockaddr * addr, in int addrlen)

其中s代表套接字描述符;

addr代表本地端點(套介面)位址結構指標;

addrlen代表本地端點位址結構大小。

此函式功能為:建立套接字與端點之間的關係,確定本地通訊物件。如通訊正常,返回0,錯誤則返回socket_error。

(3)int listen(in socket s,in int backlog)

其中s代表套接字描述符;

backlog代表設定最大的同時監聽連線個數,目前最大可設定為5(官方說法,事實上現在的windows系統最大連線數有所上公升)。

此函式功能為:設定套接字監聽模式(即伺服器模式),若成功則返回0,失敗則返回-1。

(4)int connet(in socket s,in struct sockaddr * addr, in int addrlen)

其中s代表套接字描述符;

addr代表端點套接字位址結構指標;

addrlen代表端點位址結構大小。

此函式功能為:與伺服器建立連線,若成功則返回0,失敗則返回-1。

(5)socket accept( in socket s,out struct sockaddr * addr,in out int * addrlen )

其中s代表套接字描述符;

addr代表遠端點套接字位址結構指標;

addrlen代表遠端點位址結構大小指標。

此函式功能為:接受乙個對方呼叫connect()請求的連線。該連線將在返回的新套接字上完成。若成功返回新的套接字描述符,若失敗則返回-1。並輸出addr遠端點位址和addrlen遠端點位址結構大小。

(6)int recv( in socket s,out char * buf, in int len,in int flags)

s代表套接字描述符;

buf代表接收緩衝區的指標;

len代表接收緩衝區大小;

flags代表接收方式,一般為0,msg_oob(讀取帶外資料),msg_peek(資料不從佇列中取出)為兩種特殊狀態。

此函式功能為:從套接字接收資料,資料將放在buf所指的緩衝區內。通過返回值,呼叫者可以獲得真正接收的位元組數。

(7)int send( in socket s, in char * buf,in int len, in int flags)

s代表套接字描述符;

buf代表傳送緩衝區的指標;

len代表傳送的位元組數;

flags代表傳送方式,一般為0,msg_oob(傳送帶外資料),msg_dontroute(傳送時不做路由選擇)為兩種特殊狀態。

此函式功能為:從套接字傳送資料,使用者事先準備好資料,放在buf裡。結果返回真正傳送的位元組數。

(8)int recvfrom( in socket s, out char * buf, in int len, in int flags,

out struct sockaddr * from,in out int * fromlen)

s代表套接字描述符;

buf代表接收緩衝區的指標;

len代表接收緩衝區大小;

flags代表接收方式,一般為0;

from代表遠端點位址結構指標;

fromlen代表遠端點位址結構大小指標。

此函式功能為:在套接字接收資料,並捕獲傳送遠端點位址,返**到的位元組數。

(9)int sendto( in socket s, in char * buf , in int len,

in int flags, in struct sockaddr * to, in int tolen)

s代表套接字描述符;

buf代表傳送緩衝區的指標;

len代表傳送緩衝區大小;

flags代表傳送方式,一般為0;

to代表遠端點位址結構指標;

tolen代表遠端點位址結構大小。

此函式功能為:在套接字傳送資料,資料事先已準備好,放在buf中。

(10)int shutdown( in socket s, in int how)

s代表套接字描述符;

how代表斷開連線方式,有如下幾種:

how為0(sd_receive): 套接字不再提供接收資料服務;

how為1(sd_send): 套接字不再提供傳送資料服務(根據關閉tcp連線的握手流程,此時將傳送fin);

how為2(sd_both): 套接字不再提供接收資料和傳送

正確執行返回0,錯誤則返回-1。

(11)int closesocket( in socket s)

s代表套接字描述符。

此函式功能為:關閉套接字連線,即若套接字上有連線,連線也將被關閉。

值得注意的是,在以上的函式應用中,能歸納出以下幾個重要的特點,我們應當牢記:

第一,所有的通訊類和控制類函式都以套接字為關鍵引數;

第二,位址結構長度引數有時是形參,有時是實參(為什麼會這樣?當它作為形參時只做輸入引數,而作為實參即指標傳遞時要作輸出之用);

第三,要關注套接字函式返回值,以便於對可能出現的錯誤做出處理。

socket網路程式設計筆記

一 基礎知識 xinetd 開源伺服器,監聽指定埠 1000以上 b s模式 http協議,協議頭 資料 方法get 協議頭部分 可選 connect tyoe 回些客戶端的資料的型別 必須 r n 資料tcp面向連線的通訊協議,只能用於端到端的通訊 通過三次握手建立連線,有反饋udp面向無連線的,...

網路程式設計學習筆記 socket程式設計

本地的程序間通訊 ipc 有很多種方式,總結為4類 在本地可以通過程序pid來唯一標識乙個程序,但是在網路中這是不可以的。tcp ip協議族幫我們解決了這個問題,網路層的 ip位址 可以唯一標識網路中的主機,而傳輸層的 協議 埠 可以唯一標識主機中的應用程式 程序 這樣利用三元組 ip位址 協議 埠...

socket網路程式設計 學習筆記

伺服器端先初始化socket,然後與埠繫結 bind 對埠進行監聽 listen 呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化乙個socket,然後連線伺服器 connect 如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把...