Winsock 概述

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

一、 LAN 中是的尋址方式

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

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

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

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

二、 IP 地址

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

三、 Winsock

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

用來加載 Winsock 庫的函數是 WSAStartup

int WSAStartup(

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

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

);

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

還要注意:每一個 WSAStartup 的調用必須對應一個 WSACleanup 的調用。

四、 Winsock 的尋址方式和字節順序

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

兩個 IP 地址與字符串轉換的函數:

unsigned long inet_addr(

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

);

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

IP 地址的字節順序: TCP/IP 統一規定使用大尾方式傳輸數據,即最重要的字節首先存儲。 Winsock 提供了一些函數來處理本地機器的字節順序和網絡字節順序的轉換:

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

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

u_short ntohs(u_short ?netshort <16 位的網絡字節序>)

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

上述API是平臺無關的。

五、 Winsock API

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