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
);
|