Windows網路程式設計雜談

2021-06-07 09:22:30 字數 1292 閱讀 2436

windows網路程式設計雜談

關於bind:

inaddr_any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。

例如:

sockaddr_in local;

local.sin_addr.s_addr = htonl(inaddr_any);

另外一種方式如下:

sockaddr_in local;

hostent* thishost = gethostbyname("");

char* ip = inet_ntoa(*(struct in_addr *)*thishost->h_addr_list);

local.sin_addr.s_addr = inet_addr(ip);

在這種方式下,將在系統中當前第乙個可用位址上進行繫結。在多網絡卡的環境下,可能會出問題。 

最常見的方式:

const char localip = "192.168.0.100";

sockaddr_in local;

local.sin_addr.s_addr = inet_addr(localip);

bind(socket, (lpsockaddr)&local, sizeof(sockaddr_in)

bind的安全問題:

如果你在bind時,使用了inaddr_any那麼,你將可以在所有有效的位址上進行監聽,但是socket有乙個特性:可在同一埠上繫結多個socket。

讓我們看看下面的情況:假設你的系統只有乙個ip:192.168.0.100,你希望bind到4096埠。對於下面的兩種bind,當資料報到達時,誰會接收到呢?

local.sin_addr.s_addr = htonl(inaddr_any);

local.sin_addr.s_addr = inet_addr("192.168.0.100");

winsocke庫是這樣處理的:誰繫結的最明確,誰獲取資料報。顯然,第二種bind將獲取到達的資料報。如果避免這種情況呢?使用so_execlusineaddruse選項。需要注意的是,此選項在windows nt 4 service pack 4以後(包括sp4)才可以使用。

示例**:

#ifndef so_execlusineaddruse

#define so_execlusineaddruse ((int)(~so_reuseaddr))

#endif

Windows網路程式設計

1.先總結一些會用到的知識 中計算機都分配乙個位址,該位址是乙個 32位的數值表示 客戶端和伺服器通訊的時候需要指定乙個 ip位址 和埠。ip位址 一般是用 internet標準 點分表示法 像a.b.c.d 一樣指定 的,每乙個字母代表乙個位元組的數字 十進位制 八進位制 或十六進製制 從左到右分...

windows網路程式設計

winsock是windows系統下利用socket套接字進行網路程式設計的相關函式,是windows下的網路程式設計介面。winsock在常見的windows平台上有兩個主要的版本,即winsock1和winsock2。編寫與winsock1相容的程式你需要引用標頭檔案winsock.h,如果編寫...

windows網路程式設計

include include include 要使用winsock api,就要包含ws2 32.lib這個庫 pragma comment lib,ws2 32.lib int main int argc,char ar 為埠號賦值 short port if port atoi ar 1 0 ...