不好意思!我没说清楚!想在atl服务程序里实现SOCKET服务端,客户端是另一ATL在IIS下运行的!现在有下问题:1. 在ATL服务程序里SOCKET是不是执行SOCKET.exe -Install,就开始执行了. 2. SOCKET客户端怎么把数据发给ATL服务端的SOCKET?? 我把SOCKET服务程序写在 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); MSG msg; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); _Module.RevokeClassObjects(); SocketSercice(); //SOCKET服务程序写在这里; CoUninitialize(); } 但是我客户端发送数据发现这里没反映!SOCKET程序是在另外一个程序里写好的!
上面的问题解决了,但是收发数据到是没问题了,但是每次都是第一次收发成功,第二次的时候就不行了,应该是服务端不监听了,到网上查了下看见有人用while(1){ 监听.... } 这样的方式监听很不好啊! 不一会儿机器就出报内存错误了,cpu使用过高挂了 我是在RUN里监听的!下面是我代码: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); if(!AfxSocketInit()) { WriteToLog("初始化Socket失败!"); return; }
SOCKET m_hListenSocket=0;
in_addr m_HostAddr; SOCKADDR_IN m_addr; int m_nPort;
2. SOCKET客户端怎么把数据发给ATL服务端的SOCKET??
我把SOCKET服务程序写在
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); MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg); _Module.RevokeClassObjects(); SocketSercice(); //SOCKET服务程序写在这里; CoUninitialize();
}
但是我客户端发送数据发现这里没反映!SOCKET程序是在另外一个程序里写好的!
2. 客户端是如何发送数据过去的,你的服务程序中,是否有正确listen侦听对应的socket端口等
监听....
}
这样的方式监听很不好啊! 不一会儿机器就出报内存错误了,cpu使用过高挂了
我是在RUN里监听的!下面是我代码: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);
if(!AfxSocketInit())
{
WriteToLog("初始化Socket失败!");
return;
}
SOCKET m_hListenSocket=0;
in_addr m_HostAddr;
SOCKADDR_IN m_addr;
int m_nPort;
char szHostName[128];
if( gethostname(szHostName, 128) == 0 )
{
// Get host adresses
//m_strHostName = szHostName;
hostent *pHost;
pHost = gethostbyname(szHostName);
in_addr *addr;
for( int i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )
{
addr = (struct in_addr *)pHost->h_addr_list[i];
}
m_HostAddr = *addr;
m_nPort = 4000;
}
if(m_hListenSocket)
{
closesocket(m_hListenSocket);
m_hListenSocket=NULL;
return;
}
m_hListenSocket = socket(AF_INET,SOCK_STREAM,0);
m_addr.sin_family = AF_INET;
m_addr.sin_addr = m_HostAddr;
m_addr.sin_port = htons(m_nPort);
int ret = bind(m_hListenSocket,(sockaddr*)&m_addr,sizeof(m_addr));
if(ret == SOCKET_ERROR)
{
WriteToLog("Bind Error!");
return;
} if((ret = listen(m_hListenSocket,2))==SOCKET_ERROR)
{
WriteToLog("Listen Error!");
return;
}
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_hListenSocket,&fdread);
timeval timeout = {5,5};
AfxBeginThread(ListenProc,&m_hListenSocket);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg); _Module.RevokeClassObjects(); CoUninitialize();
}
UINT ListenProc( LPVOID pParam )
{
int ret=0;
char buff[4096];
char signBuf[4096];
SOCKET m_hListenSocket = *(SOCKET*)pParam;
SOCKET m_hCommuSocket;
if((m_hCommuSocket = accept(m_hListenSocket,NULL,NULL))==SOCKET_ERROR)
{
WriteToLog("Accept Error!");
return -1;
}
WriteToLog("连接成功!");
ret = recv(m_hCommuSocket, buff, 4096, 0);
if(ret == 0){
// WriteToLog("Recv data error: %d\n", WSAGetLastError());
WriteToLog("recive error!");
return -1;
}
ret = dateGo(buff, signBuf);
if (ret != 0) {
return 0;
}
send(m_hCommuSocket, signBuf, 4096, 0);
printf(buff);
return 0;
}
怎么才能让服务端一直监听呢????
while (1) {
if((ret = listen(m_hListenSocket,2))==SOCKET_ERROR)
{
WriteToLog("Listen Error!");
return;
}
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_hListenSocket,&fdread);
timeval timeout = {5,5};
SOCKET m_hCommuSocket;
if((m_hCommuSocket = accept(m_hListenSocket,NULL,NULL))==SOCKET_ERROR)
{
WriteToLog("Accept Error!");
return ;
}
else{
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_hListenSocket,&fdread);
timeval timeout = {5,5};
AfxBeginThread(ListenProc,&m_hCommuSocket);
}
}UINT ListenProc( LPVOID pParam )
{
int ret=0;
char buff[4096];
char signBuf[4096];
SOCKET m_hCommuSocket = *(SOCKET*)pParam;
/* SOCKET m_hCommuSocket;
if((m_hCommuSocket = accept(m_hListenSocket,NULL,NULL))==SOCKET_ERROR)
{
WriteToLog("Accept Error!");
return -1;
}
WriteToLog("连接成功!");*/
ret = recv(m_hCommuSocket, buff, 4096, 0);
if(ret == 0){
// WriteToLog("Recv data error: %d\n", WSAGetLastError());
WriteToLog("recive error!");
return -1;
}
ret = NetSigndatachsign(buff, signBuf);
WriteToLog(signBuf);
if (ret != 0) {
return 0;
}
send(m_hCommuSocket, signBuf, 4096, 0);
printf(buff);
return 0;
}
高手指正下看这样会不会有问题!! 谢谢! 我加分了哦......
这样的错误 但是同样的函数我放进mfc的工程里 就没任何问题 头文件,引用路径等 俩工程时一样的啊 不知道咋回事 请有空回复下