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
是网络编程接口,而不是协议。