【网络编程】之一、初识WinSocket

Winsock是Windows下的网络编程接口,它是由Unix下的BSD Socket发展而来,是一个与网络协议无关的编程接口。

  Winsock在常见的Windows平台上有两个主要的版本,即Winsock1和Winsock2。编写与Winsock1兼容的程序你需要引用头文件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H此外还有一个MSWSOCK.H头文件,它是专门用来支持在Windows平台上高性能网络程序扩展功能的使用WINSOCK.H头文件时,同时需要库文件WSOCK32.LIB,使用WINSOCK2.H时,则需要WS2_32.LIB如果使用MSWSOCK.H中的扩展API,则需要MSWSOCK.LIB。正确引用了头文件,并链接了对应的库文件,你就构建起编写WINSOCK网络程序的环境了。


OK,下面我们来看看具体用法:

初始化winsocket

每个Winsock程序必须使用WSAStartup载入合适的Winsock动态链接库,如果载入失败,WSAStartup将返回SOCKET_ERROR,这个错误就是WSANOTINITIALISED,WSAStartup的定义如下:

[cpp]  view plain copy
  1. int WSAStartup(  
  2.     WORD wVersionRequested,  
  3.     LPWSADATA lpWSAData  
  4. );  

wVersionRequested指定了你想载入的 Winsock版本,其高字节指定了次版本号,而低字节指定了主版本号。你可以使用宏 MAKEWORD(x, y)来指定版本号,这里x代表主版本,而y代表次版本。lpWSAData是一个指向WSAData结构的指针,WSAStartup会向该结构中填充其载入的Winsock动态链库的信息。

lpWSAData是一个指向WSAData结构的指针,WSAStartup会向该结构中填充其载入的Winsock动态链库的信息。

[cpp]  view plain copy
  1. typedef struct WSAData   
  2. {  
  3.     WORD           wVersion;       //wVersion为你将使用的Winsock版本号  
  4.     WORD           wHighVersion;//wHighVersion为载入的Winsock动态库支持的最高版本,  
  5. 注意,它们的高字节代表次版本,低字节代表主版本。  
  6.     char           szDescription[WSADESCRIPTION_LEN + 1];   
  7.     char           szSystemStatus[WSASYS_STATUS_LEN + 1];//上面两个变量由特定版本的Winsock设置,实际上没有太大用处。  
  8.     unsigned short iMaxSockets;//表示最大数量的并发Sockets,其值依赖于可使用的硬件资源。  
  9.     unsigned short iMaxUdpDg;// iMaxUdpDg表示数据报的最大长度  
  10.     char FAR *     lpVendorInfo;//是为Winsock实现而保留的制造商信息,  
  11. 这个在Windows平台上并没有什么用处.  
  12. } WSADATA, * LPWSADATA;   

当你使用完Winsock接口后,要调用下面的函数对其占用的资源进行释放:
     int WSACleanup(void);
如果调用该函数失败也没有什么问题,因为操作系统为自动将其释放,对应于每一个WSAStartup调用都应该有一个WSACleanup调用.

错误处理:

Winsock函数调用失败大多会返回 SOCKET_ERROR(实际上就是-1),你可以调用WSAGetLastError得到错误的详细信息:

[cpp]  view plain copy
  1. int WSAGetLastError (void);  
对该函数的调用将返回一个错误码,其码值在WINSOCK.H或WINSOCK2.H(根据其版本)中已经定义,这些预定义值都以WSAE开头.同时你还可以使用WSASetLastError来自定义错误码值.


代码示例:

下面是来自msdn的示例:

[cpp]  view plain copy
  1. #define WIN32_LEAN_AND_MEAN  
  2.   
  3. #include <windows.h>  
  4. #include <winsock2.h>  
  5. #include <ws2tcpip.h>  
  6. #include <stdio.h>  
  7.   
  8. // Need to link with Ws2_32.lib  
  9. #pragma comment(lib, "ws2_32.lib")  
  10.   
  11.   
  12. int __cdecl main()  
  13. {  
  14.   
  15.     WORD wVersionRequested;  
  16.     WSADATA wsaData;  
  17.     int err;  
  18.   
  19. /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */  
  20.     wVersionRequested = MAKEWORD(2, 2);  
  21.   
  22.     err = WSAStartup(wVersionRequested, &wsaData);  
  23.     if (err != 0) {  
  24.         /* Tell the user that we could not find a usable */  
  25.         /* Winsock DLL.                                  */  
  26.         printf("WSAStartup failed with error: %d\n", err);  
  27.         return 1;  
  28.     }  
  29.   
  30. /* Confirm that the WinSock DLL supports 2.2.*/  
  31. /* Note that if the DLL supports versions greater    */  
  32. /* than 2.2 in addition to 2.2, it will still return */  
  33. /* 2.2 in wVersion since that is the version we      */  
  34. /* requested.                                        */  
  35.   
  36.     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {  
  37.         /* Tell the user that we could not find a usable */  
  38.         /* WinSock DLL.                                  */  
  39.         printf("Could not find a usable version of Winsock.dll\n");  
  40.         WSACleanup();  
  41.         return 1;  
  42.     }  
  43.     else  
  44.         printf("The Winsock 2.2 dll was found okay\n");  
  45.           
  46.   
  47. /* The Winsock DLL is acceptable. Proceed to use it. */  
  48.   
  49. /* Add network programming using Winsock here */  
  50.   
  51. /* then call WSACleanup when done using the Winsock dll */  
  52.       
  53.     WSACleanup();  
  54.   
  55. }  

这里只是初识winsocket!大概了解一下!

2012/8/14

jofranks 于南昌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值