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函数释放计时器。

  • 相关阅读:
    Visual Studio Error C4335 检测到Mac文件格式:请将源文件转换为DOS格式或UNIX格式
    Visual Studio 2017在编译时出现错误E2512:功能测试宏的参数必须是简单标识符
    PCL 注意事项
    Realsense D435i Winodws和Linux开发环境配置
    Hybrid Astar
    Git 分支管理
    Visula Studio 安装 Visual Assist
    Typora 设置字体颜色
    Mac上使用Charles+Chrome
    linux Kill 命令
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2743106.html
Copyright © 2011-2022 走看看