windows網路程式設計

2021-08-20 09:56:23 字數 3620 閱讀 5009

winsock是windows系統下利用socket套接字進行網路程式設計的相關函式,是windows下的網路程式設計介面。

winsock在常見的windows平台上有兩個主要的版本,即winsock1和winsock2。編寫與winsock1相容的程式你需要引用標頭檔案winsock.h,如果編寫使用winsock2的程式,則需要引用winsock2.h。此外還有乙個mswsock.h標頭檔案,它是專門用來支援在windows平台上高效能網路程式擴充套件功能的。使用winsock.h標頭檔案時,同時需要庫檔案wsock32.lib,使用winsock2.h時,則需要ws2_32.lib,如果使用mswsock.h中的擴充套件api,則需要mswsock.lib。正確引用了標頭檔案,並鏈結了對應的庫檔案,你就構建起編寫winsock網路程式的環境了。

一般來說,比較熟知的網路模型即osi(open system interconnect)模型,它分為七層,即物理層,資料鏈路層,網路層,傳輸層,會話層,表示層以及應用層。而真正得到廣泛應用的事tcp/ip 模型。在windows系統下,同樣採用了tcp/ip模型進行不同主機以及不同網路間的通訊。使用winsock程式設計,即必須使用tcp/ip等相關協議進行通訊。

在winsock中,提供了tcp/ip協議下使用的套接字位址,即sockaddr_in結構體,在msdn中查到其結構體的具體定義為:

其中:sin_family的值必須指定為af_inet,代表所屬位址家族是tcp/ip位址家族;

sin_port代表埠號。我們知道,在tcp/ip協議,正是通過ip位址以及埠號實現端與端的通訊。在tcp/ip協議中,有65536個埠號,因此指定為無符號short型別;

in_addr同樣是結構體。其結構為:

注:具體的使用方式以及注釋都可查閱msdn;

接下來本文將針對tcp協議具體實現進行簡單的介紹。

1、建立套接字:由於採用的是tcp協議,因此必須採用流式套接字,因為tcp協議採取的是位元組流的方式進行傳輸資料的。

[cpp] 

view plain

copy

socket s;  

s=::socert(af_inet,sock_sream,0);  

其中:

最後乙個引數指定為0的原因是因為在af中已經指定位址格式為tcp/ip協議規定的位址格式,因此最後乙個引數協議型別指定為0;

2、繫結位址資訊

使用函式bind()即可完成位址資訊的繫結。這個過程完成的是套接字和位址資訊的繫結。

參照**: 

[cpp] 

view plain

copy

sockaddr_in addr;  

addr.sin_family=af_inet;  

addr.sin_port=htons(80);  

addr.sin_addr.s_un.s_addr=inaddr_any;  

::bind(s,(sockaddr)&addr,sizeod(addr));  

3、作為tcp伺服器必須處於監聽狀態,隨時監聽客戶端的連線請求。這個過程是通過listen()函式實現的。

4、客戶端傳送連線請求。該函式於bind函式的結構類似。

這裡的sockaddr定義的位址指標是伺服器的位址指標;

5.伺服器接受客戶端的連線請求。實現函式為accept(),結構和connect()以及bind()類似,不同的是定義的結構指標應該為客戶端的位址指標;

最後將tcp協議的實現**貼在本文,實現平台是visual c++6.0中建立控制台應用程式實現。

伺服器**:

[cpp] 

view plain

copy

#include //包含標頭檔案

#include

#include

#pragma comment(lib,"ws2_32.lib")           //顯式連線套接字型檔

intmain()                                  

//主函式開始

::closesocket(s);                       //關閉套接字控制代碼

::closesocket(s1);  

::wsacleanup();                         //釋放套接字型檔

if(getchar())                           

//如果有輸入,則關閉程式

else

}  }  客戶端**:

[cpp] 

view plain

copy

#include //包含標頭檔案

#include

#include

#pragma comment(lib,"ws2_32.lib")       //顯式連線套接字型檔

intmain()                          

//主函式開始

;  s=::socket(af_inet,sock_stream,0);          //建立tcp套接字

sockaddr_in addr;                   //定義套接字位址結構

addr.sin_family=af_inet;                //初始化位址結構

addr.sin_port=htons(75);  

addr.sin_addr.s_un.s_addr=inet_addr("127.0.0.1"

);  

printf("客戶端已經啟動\r\n"

);              

//輸出提示資訊

::connect(s,(sockaddr*)&addr,sizeof

(addr));  

::recv(s,sztext,sizeof

(sztext),0);  

printf("%s\r\n"

,sztext);  

::closesocket(s);                   //關閉套接字控制代碼

::wsacleanup();                     //釋放套接字型檔

if(getchar())                       

//如果有輸入,則關閉程式

else

}  

Windows網路程式設計

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

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

Windows網路程式設計雜談

windows網路程式設計雜談 關於bind inaddr any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。例如 sockaddr i...