在前面的內容中,我們知道了通訊的基本流程,在通訊過程中會用到很多套接字函式,諸如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 如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把...