zoukankan      html  css  js  c++  java
  • gethostname为什么返回错误

    这是今天用到的两个函数

    (1)gethostname(char*p,int n)

    (2)ReOPenkeyEx()

    主要说一下第一个函数的意思,只有在调用WSAstartup后,该函数才能正确的返回主机名,原因是为什么?WSAstartup 的作用是是什么?是否每次调用都得有WSAstartup?

    //---------------------

    (1)WSAStartup有什么作用?

         为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

    WSAStartup应该与WSACleanup成对使用,WSAStartup的功能是初始化Winsock   DLL,WSACleanup是来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

          在Windows下,Socket是以DLL的形式实现的。在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup.

    (2) 重复调用WSAStartup()对程序有没有影响?

    没有影响,WSAStartup()只是初始化变量的环境,也就是说声明需要的版本号等信息,不会有副作用,需要注意的是每次调用完后要用WSACleanup来释放计数器。

    与此功能相类似的一个函数是

    BOOL AfxSocketInit(
       WSADATA* lpwsaData = NULL 
    );

    Collapse imageParameters

    lpwsaData

    A pointer to a WSADATAstructure. If lpwsaData is not equal to NULL, then the address of the WSADATA structure is filled by the call to WSAStartup. This function also ensures that WSACleanup is called for you before the application terminates.

    我们可以看到,该函数的另一个功能是在调用完WSAStartup后自动的调用WSACleanup函数释放计时器。

  • 相关阅读:
    编码导致 html和aspx 样式差异,变形
    Recommand of the Day:Names in English
    NSBundle常用方法及解释
    在K8S 中部署 Spring Boot 应用,爽!
    如果抛开 Spring,如何自己实现 AOP?面试必问。。。
    为什么阿里强制 boolean 类型变量不能使用 is 开头?
    CTO 说禁用 Lombok,看我怼死他。。
    面试官:什么是 YAML?和 Spring Boot 有什么关系?
    面试官:线程池多余的线程是如何回收的?
    JetBrains 发布下一代 IDE,无比轻量,几秒就能启动干活,IDEA 可以扔了。。
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2743106.html
Copyright © 2011-2022 走看看