Winsock 概述

Socket 函數(shù)是 Windows 在傳輸層中應用的編程接口。所以使用 WinSock 主要是開發(fā)基于 TCP UDP 的應用程序。

一、 LAN 中是的尋址方式

LAN 中主要使用廣播通信。所以通信時的關鍵問題是當競爭存在時如何決定誰使用通道。 MAC 子層就是用來解決此問題的,它是鏈路層的子層。 MAC 是控制 LAN 中的廣播通信的。

網(wǎng)絡中的節(jié)點(主機或路由器)都有鏈路層地址。鏈路層地址通常叫做 LAN 地址、物理層地址或 MAC 地址。比如: E6-E9-00-17-BB-4B.

局域網(wǎng) (LAN) 通信原理: 當適配器想要發(fā)送一個幀到其他適配器時,發(fā)送適配器將目的適配器的 MAC 地址插入到封包中,然后以廣播的方式將此封包發(fā)送到 LAN 中的每一臺主機。如果想要 LAN 中的所有其他適配器都接收并處理它發(fā)送的幀,這種情況下就要插入一個特定的 MAC 廣播地址即可,即 FF-FF-FF-FF-FF-FF.

一旦封包從 LAN 的網(wǎng)關出來進入 Internet ,鏈路層地址就不再有用,這時各路由器是依靠網(wǎng)絡層的 IP 地址來尋找目標主機。

二、 IP 地址

互聯(lián)網(wǎng)上的每個主機和路由器都有 IP 地址,它將網(wǎng)絡號和主機號編碼在一起。注意: IP 地址指定的并不是主機,而是網(wǎng)絡接口。

三、 Winsock

Winsock 庫有兩個版本,現(xiàn)在開發(fā)網(wǎng)絡應用程序都使用 WinSock2. 它包含了絕大部分 socket 函數(shù)和相關結構類型的聲明和定義。同時要添加 WS2_32..lib 鏈接庫。

用來加載 Winsock 庫的函數(shù)是 WSAStartup

int WSAStartup(

? __in????????? WORD wVersionRequested,? // 指定想要加載的 Winsock 庫的版本。高字節(jié)為次版本號,低字節(jié)為主版本號。

? __out???????? LPWSADATA lpWSAData,?? // 一個指向 WSADATA 的指針,用來返回 DLL 庫的詳細信息。

);

??? 如果函數(shù)調(diào)用成功,則返回 0 ,否則會返回錯誤代碼。這時就不需要用 WSAGetLastError 函數(shù)查看出錯原因。

還要注意:每一個 WSAStartup 的調(diào)用必須對應一個 WSACleanup 的調(diào)用。

四、 Winsock 的尋址方式和字節(jié)順序

Winsock 中,應用程序通過 SOCKADDR_IN 結構來指定 IP 地址和端口號。 Struct sockaddr_in

兩個 IP 地址與字符串轉換的函數(shù):

unsigned long inet_addr(

? __in ?const char* cp; // 將一個 "aa.bb.cc.dd" 類型的 IP 地址字符串轉化為 32 位的二進制數(shù)。

);

char* FAR inet_ntoa(
? __in ?struct?? in_addr in
);
//
32 位二進制數(shù)轉化為字符串。

IP 地址的字節(jié)順序: TCP/IP 統(tǒng)一規(guī)定使用大尾方式傳輸數(shù)據(jù),即最重要的字節(jié)首先存儲。 Winsock 提供了一些函數(shù)來處理本地機器的字節(jié)順序和網(wǎng)絡字節(jié)順序的轉換:

u_short htons(u_short hostshort <16 位的主機字節(jié)序>);

u_long htonl(u_long hostlong <32 位的主機字節(jié)序>) //轉換為網(wǎng)絡字節(jié)序

u_short ntohs(u_short ?netshort <16 位的網(wǎng)絡字節(jié)序>)

u_long ntohl(u_long netlong <32 位的網(wǎng)絡字節(jié)序>) //轉換為主機字節(jié)序

上述API是平臺無關的。

五、 Winsock API

在每個 Wi n 3 2 平臺上, Wi n s o c k 都以不同的形式存在著。 Wi n s o c k 是網(wǎng)絡編程接口,而不是協(xié)議。