zoukankan      html  css  js  c++  java
  • Winsock编程入门1.初始化Winsock

    什么是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());
       }
    }

  • 相关阅读:
    解决centos yum源配置出现Couldn't resolve host 问题
    Centos7下MongoDB下载安装详细步骤
    PHP操作mongodb扩展的坑 及php7安装mongodb扩展
    阿里云 Composer 全量镜像
    centos beanstalkd 安装 与php调用
    centos与windows共享文件夹
    centos php 安装编译 常见报错
    [PHP] layui实现多图上传,图片自由排序,自由删除
    Vue-element-admin实现菜单根据用户权限动态加载
    迭代器的使用方法
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/312763.html
Copyright © 2011-2022 走看看