Socket高階程式設計 一

2022-09-18 05:06:33 字數 3098 閱讀 4853

套接字選項

套接字建立之後,可使用套接字選項設定套接字的屬性,以改變套接字的行為

1.setsockopt()

int setsockopt(socket s, int level, int optname, const char *optval, int optlen)

函式功能:設定套接字選項

引數:第乙個引數是套接字控制代碼

第二個引數指定此選項被定義在哪個級別,sol_socket,ipproto_tcp, ipproto_ip等

第三個引數是設定的套接字選項名稱

第四個引數指定乙個緩衝區用來存放設定的選項

第五個引數是第四個引數的大小,即指定的緩衝區大小

返回:如果函式執行成功,返回0,執行失敗,返回socket_error

注:套接字選項的級別:

協議是分層的,每層有多個協議,不同層對應不同的級別

1)      最高層是應用層,套接字就工作在這一層,這一層的屬性對應著sol_socket級別

2)      在下層是傳輸層,這層有tcp和udp協議,分別對應著ipproto_tcp, ipproto_udp級別

3)      在下面是網路層,有ip協議,對應著ipproto_ip級別等

注:各級別的屬性不同,同一級別不同協議的屬性也可能不同。

目前用到的選項級別及其下的選項名稱:

sol_socket級別:

1)      so_broadcadt  bool型別,設定套接字傳送或接受廣播資訊,如果給定套接字已經被設定為傳送或接受廣播資料,查詢此套接字選項將返回true。

2)      so_reuseraddr  bool型別,如果值為true,套接字可以被繫結到乙個已經被另乙個套接字使用的位址,預設情況下,套接字不能被繫結到乙個已經使用的本地位址,然而,有時候為了達到一些特殊的目的需要重用位址,這時候就要將這個選項設定為true

注:對監聽套接字,兩個不同的監聽套接字不能繫結到相同的本地位址去監聽到來的連線,如果這樣做的話,結果是未定義的。

socket廣播通訊

利用廣播可將資料傳送給本地子網上的每個主機,必須有一些執行緒在機器上監聽到來的資料,廣播的缺點是如果多個程序都傳送廣播資料,網路就會阻塞,網路效能便會受到影響。

為了進行廣播通訊,必須開啟廣播選項so_broadcast,然後使用recvfrom,sendto等函式收發廣播資料

對廣播通訊,有乙個特定的廣播位址-255.255.255.255,廣播資料都應該傳送到這裡

1.廣播程式的傳送方sender

傳送方程式:

1)      建立套接字

2)      使用setsockopt函式開啟so_broadcast選項

3)      設定廣播位址255.255.255.255,向埠號4567不斷傳送廣播資料

廣播通訊傳送端程式**:

socket s = socket(af_inet, sock_dgram, 0);

//設定so_broadcast選項為有效

bool bbroadcast = true;

setsockopt(s, sol_socket, so_broadcast, (char *)&bbroadcast, sizeof(bool));

//設定廣播位址,255.255.255.255,廣播埠(電台)是4567

sockaddr_in bcast;

bcast.sin_family = af_inet;

bcast.sin_addr.s_addr = inaddr_broadcast;

bcast.sin_port = htons(4567);

//傳送廣播

printf(「開始向4567埠傳送廣播資料…\n\n」);

char sz = 「hello world」;

while(true)

sendto(s, sz, strlen(sz)+1, 0, (sockaddr *)&bcast, sizeof(bcast));

sleep(5000);

注:設定套接字選項時,我們需要指定選項所在的級別,選項名,設定乙個char*型別的緩衝區存放選項的值,傳入這個緩衝區的位址,並在隨後的引數指定選項的值的記憶體大小

(單位是位元組)

socket相關的api中,當我們需要向api傳入乙個值時,通常定義乙個緩衝區存放這個值,把這個緩衝區的起始位址作為char *傳入,並用隨後的乙個引數指明這個值占用的記憶體大小,這樣就可以正確的取出這個值了

廣播通訊接收端reciever:

建立乙個套接字

繫結到乙個本地位址,指明廣播埠號

接受廣播

注:接受廣播通訊時不需要設定套接字選項,只需要把接受程式繫結到廣播電台埠,呼叫recvfrom函式即可接受到廣播資料即可,和其他udp程式沒什麼不同,就好像收聽電台時只需調整自己的頻率到廣播埠就可以收到資料一樣。

即傳送端設定乙個電台,接收端只需把頻道調到這個電台就可收到廣播資料

接收端程式段:

socket s = socket(af_inet, sock_dgram, 0);

//首先要繫結乙個本地位址,指明廣播埠號

sockaddr_in sin;

sin.sin_family = af_inet;

sin.sin_addr.s_un.s_addr = inaddr_any;

sin_sin_port = ntohs(4567);

int err = bind(s, (sockaddr *)&sin, sizeof(sin));

if(socket_error == err)

printf(「bind error\n」);

return;

//接受廣播

printf(「開始在4567埠接受廣播資料…\n\n」);

sockaddr_in addrremote;

int nlen = sizeof(addrremote);

char sz[256];

while(true)

int nret = recvfrom(s, sz, 256, 0, (sockkaddr *)&addrremote, &nlen);

printf(「%s」,sz);

注:廣播程式只能應用在本地子網中,因為沒有路由器**廣播資料。

Linux 高階Socket程式設計

基本套接字分為客戶機 伺服器和點對點模式。c s sever client 一般採用tcp b s browser server 一般採用udp 常用的資料結構有in addr 儲存ip位址 sockaddr in 表示internet協議位址結構 sockaddr 儲存主機ip位址和介面資訊 st...

socket程式設計(一)

1 socket可以看成是使用者程序與核心網路協議的程式設計介面。2 socket不僅可以用於本機的程序間通訊,還可以用於網路不同主機的程序間通訊。異構架構可以不同 手機pc ipv4套介面位址結構通常也稱為 網際套接字位址結構 它以sockaddr in命名,定義在標頭檔案中 struct soc...

socket程式設計(一)

include include pragma comment lib,ws2 32.lib using namespace std int main int argc,char argv 建立套接字 socket slisten socket af inet,sock stream,ipproto ...