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

 

 

 

posted @ 2012-10-28 03:55  CBDoctor  阅读(2019)  评论(0编辑  收藏  举报