想在ATL里建个socket服务端,客户端也是一ATL但是是在IIS 和.net环境下使用,哪我服务端是不是要做成多线程的?还是服务端和客户端都要做成多线程的??? 对IIS和ATL不熟悉,大家说说意见!!

解决方案 »

  1.   

    晕!哪我的socket监听程序写在那里???  这个监听怎么启动?
      

  2.   

    不好意思!我没说清楚!想在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程序是在另外一个程序里写好的!
      

  3.   

    1. -install的命令行,只要正确处理注册好com服务器等,就可以使用了...
    2. 客户端是如何发送数据过去的,你的服务程序中,是否有正确listen侦听对应的socket端口等
      

  4.   

    上面的问题解决了,但是收发数据到是没问题了,但是每次都是第一次收发成功,第二次的时候就不行了,应该是服务端不监听了,到网上查了下看见有人用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;

    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;   
    }
    怎么才能让服务端一直监听呢????
      

  5.   

    问题解决了!
    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;   
    }   
    高手指正下看这样会不会有问题!!  谢谢!  我加分了哦......
      

  6.   

    借贵宝地 问下 楼上贴代码的哥们 我也是在ATL工程里写的通信程序 但是像这些ioctlsocket等等 Socket函数 我直接调用 结果编译到最后出现一堆 error LNK2019: unresolved external symbol __imp__closesocket@...
    这样的错误  但是同样的函数我放进mfc的工程里 就没任何问题 头文件,引用路径等 俩工程时一样的啊  不知道咋回事 请有空回复下