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 ...