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é)議。