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
是網絡編程接口,而不是協議。