什么是Winsock

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网络程序的环境了。

初始化Winsock

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

int WSAStartup(
    WORD wVersionRequested,
    LPWSADATA lpWSAData
);

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

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

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

typedef struct WSAData
{
    WORD           wVersion;
    WORD           wHighVersion;
    char           szDescription[WSADESCRIPTION_LEN + 1];
    char           szSystemStatus[WSASYS_STATUS_LEN + 1];
    unsigned short iMaxSockets;
    unsigned short iMaxUdpDg;
    char FAR *     lpVendorInfo;
} WSADATA, * LPWSADATA;

wVersion为你将使用的Winsock版本号,wHighVersion为载入的Winsock动态库支持的最高版本,注意,它们的高字节代表次版本,低字节代表主版本。
    szDescription与szSystemStatus由特定版本的Winsock设置,实际上没有太大用处。
    iMaxSockets表示最大数量的并发Sockets,其值依赖于可使用的硬件资源。
    iMaxUdpDg表示数据报的最大长度;然而,获取数据报的最大长度,你需要使用WSAEnumProtocols对协议进行查询。
    最大数量的并发Sockets并不是什么神奇的数字,它是由可用的物理资源来决定的.
    lpVendorInfo是为Winsock实现而保留的制造商信息,这个在Windows平台上并没有什么用处.

自Windows 95以后的操作系统都支持Winsock 2.2的版本.即使是这样,你也不能认为这些Windows平台支持最新的Winsock版本,为了让你的程序能够运行于大多数平台,最好使用Winsock1.1规范.
    
    当你使用完Winsock接口后,要调用下面的函数对其占用的资源进行释放:

int WSACleanup(void);

如果调用该函数失败也没有什么问题,因为操作系统为自动将其释放,对应于每一个WSAStartup调用都应该有一个WSACleanup调用.

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

int WSAGetLastError (void);

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

以下是一个使用上述知识初始化Winsock的一个例子(记得要引用Winsock的lib库).

#include <winsock2.h>

void main(void)
{
   WSADATA wsaData;
    
    int Ret;

// Initialize Winsock version 2.2

if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
   {
      // NOTE: Since Winsock failed to load we cannot use
      // WSAGetLastError to determine the specific error for
      // why it failed. Instead we can rely on the return
      // status of WSAStartup.

printf("WSAStartup failed with error %d\n", Ret);
      return;
   }

// Setup Winsock communication code here

// When your application is finished call WSACleanup
   if (WSACleanup() == SOCKET_ERROR)
   {
      printf("WSACleanup failed with error %d\n", WSAGetLastError());
   }
}

转自:http://blog.sina.com.cn/s/blog_4e5afd3601009ibu.html

什么是Winsock WSAData ?相关推荐

  1. Winsock网络编程快速入门

     一.基本知识 1.Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信.具有两个版本: Winsock 1: Windows CE平台支持. ...

  2. 在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)

    原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议) 原文:  http://www.csdn.net/develop/read_article.as ...

  3. lcx源代码以及免杀的研究

    ========================================================================== 先转载一下别人的文章,后面有我的分析 ====== ...

  4. WinSocket模型的探讨——完成端口模型

    众所皆知,完成端口是在WINDOWS平台下效率最高,扩展性最好的IO模型,特别针对于WINSOCK的海量连接时,更能显示出其威力.其实建立一个完成端口的服务器也很简单,只要注意几个函数,了解一下关键的 ...

  5. TCP-Traceroute 核心代码

    测试环境: 操作系统: Microsoft Windows 2000 with Service Pack 4 开发环境: Microsoft Visual C++6 with Service Pack ...

  6. c语言网络定向拉取数据,用C模拟了一个http请求,但是recv函数接收的数据不完整且欠安顺序获取信息...

    用C模拟了一个http请求,但是recv函数接收的数据不完整且不安顺序获取信息 用C模拟了一个http请求,但是recv函数接收的数据不完整且不安顺序获取信息 我把代码贴上 #include #inc ...

  7. 【教你抢课】C++网络编程之使用Winsock2实现教务系统自动抢课程序

    一.开发环境及工具: · Microsoft Visual Studio(本程序使用的是Microsoft Visual Studio 2012) · Chrome浏览器(其他浏览器也可以) 二.原理 ...

  8. TCP/IP编程:DNS域名解析

    一.地址转换总体思路 深入底层,地址还是二进制形式,只是存储方式有小端还有大端形式: 表示给用户时:点分十进制数表示的IP地址转换成网络字节顺序的IP地址 网络实际传输时:主机字节顺序转成网络字节顺序 ...

  9. 6.2 ShellCode的高效提取技巧

    转自  <Q版缓冲区溢出教程.doc> http://download.csdn.net/detail/xiancaonima/2589152 本文最后有本doc文档的目录. 6.2 Sh ...

  10. 利用原始socket简单实现FTP的客户端和服务器端程序

    1.设计目的 本设计旨在利用原始socket简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序,能够实现get.put.pwd.dir.cd等基本交互命 ...

最新文章

  1. bigdecimal类型数据的min方法
  2. Bioinfo:学习Python,做生信PartII 学习笔记
  3. 光流 | 基于Lukas-Kanade光流法的目标跟踪(附C++代码)
  4. 【蓝桥杯Java_C组·从零开始卷】第六节(一)、Java常用数学函数
  5. Git之深入解析如何贮藏工作分支与清理工作目录
  6. Spring Boot 快速集成第三方登录功能
  7. php格式化输出字_PHP 输出格式化字符串
  8. CCP/XCP和T-BOX知识点
  9. 高速收发器之8B/10B编码
  10. 多种方法实现二叉树的先序、中序、后序、层序遍历
  11. Java 基础 之 变量
  12. K线形态识别—双K线之卖出型双日K线组合
  13. 如何在SendWS做到WhatsApp客服系统,WhatsApp云控客服系统有作用?为什么选择WhatsApp做海外营销推广?
  14. 电脑系统声音常见故障问题解决方法汇总
  15. 联发科mt6735详细参数_联发科MT6737和MT6735芯片资料和性能对比
  16. 计算机英语专利,计算机专利用英语词汇1500词.pdf
  17. c语言结构体冒泡排序,c语言结构体冒泡排序求教
  18. 转载_纯Java代码批量去除图片文字水印
  19. 大二学生2021的坎坷之路(他会晋升吗?)
  20. 老虎过河编程java_2017年拓展游戏《老虎过河》

热门文章

  1. win10系统回收站隐藏的方法
  2. 如何在php文件中插入图片,使用PHPWord读取Word文件并插入图片
  3. 五十一个经典小故事5
  4. 360安全杀毒软件扫描计算机病毒,360木马查杀能扫描病毒吗
  5. 对于注塑模具设计的原则,这些核心你掌握了吗?
  6. SAP注塑行业ERP系统软件的分析
  7. 手淘首页流量突然暴跌的原因,怎么办?
  8. xp系统怎么查看计算机共享文件夹,xp系统提升查看局域网共享文件速度方法分享...
  9. SMI/SAMI 字幕
  10. LUOGU P1512 伊甸园日历游戏