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

  • 相关阅读:
    APUE习题3.2用dup实现dup2以及shell中重定向符号的使用
    如何理解git checkout -- file和git reset HEAD -- file
    bash中通过设置PS1变量改变提示符颜色
    Ubuntu中root的默认密码
    Kali中装中文输入法小企鹅
    Find the Top 10 commands in your linux box!
    简明awk教程(Simple awk tutorial)
    PHP错误解决:Fatal error: Unknown: Failed opening required ...
    简单的端口扫描器(TCP connect)
    c# 爬虫(三) 文件上传
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2743106.html
Copyright © 2020-2023  润新知