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