关于网友提出的“ 高手请赐教:为什么服务里面创建Socket老是出错?”问题疑问,本网通过在网上对“ 高手请赐教:为什么服务里面创建Socket老是出错?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 高手请赐教:为什么服务里面创建Socket老是出错?
描述: 我用ATL向导写了一个简单的服务,在Run里面想创建一个Socket监听客户端的连接,但是为什么调用PtListenSocket->Create(nPortNo)的时候老师弹出assert错呢?
我跟了一下,错误是在AfxGetInstanceHandle()返回的句柄为NULL。
我把同样的代码放到一个一般的MFC的程序中就没有任何问题。急啊!请高手帮帮我,在线等待。谢谢。
CSvrListenSocket *PtListenSocket;
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId();
HRESULT hr = CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
_ASSERTE(SUCCEEDED(hr));
// This provides a NULL DACL which will allow access to everyone.
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
hr = CoInitializeSecurity(sd, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
_ASSERTE(SUCCEEDED(hr));
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
_ASSERTE(SUCCEEDED(hr));
LogEvent(_T("Service started"));
if (m_bService)
SetServiceStatus(SERVICE_RUNNING);
int nPortNo=12345;
if (!AfxSocketInit())
return ;
AfxSocketInit();
PtListenSocket = new CSvrListenSocket();
//12345:端口号
//服务器端口号:5000---65536
if(PtListenSocket->Create(nPortNo))
{//开始侦听
if(PtListenSocket->Listen())
{
bReady=TRUE;
}
}
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
_Module.RevokeClassObjects();
CoUninitialize();
}
解决方案1: WSAStartup了没有?
解决方案2: 不能用了。用api多好啊!
解决方案3: 不要用mfc的类了.
使用socket api函数吧.
以上介绍了“ 高手请赐教:为什么服务里面创建Socket老是出错?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3617124.html