一般情况下是放在死循环中,将套接口设置为阻塞方式,当有一个请求来
后启动一个线程为这个请求服务。

解决方案 »

  1.   

    最好开新线程来处理侦听(可以在循环中),这样主线程才能响应服务管理器的启动,停止等操作。
    我们写的很多服务程序都是这样做的。
      

  2.   

    两位大虾帮忙看一下,我的mywork应该放在什么地方?
    VOID MyWork()
    {
    //后台要执行的任务,就是SOCKET开始侦听,用的是CSOCKET
    if (!FileListen.Create(8060,SOCK_STREAM,FD_ACCEPT,"171.171.1.4"))
    {
    fp=fopen("c:/temp/work04.txt","w");
    fclose(fp);
    return 0;
    }
    if(!FileListen.Listen())
    {
    fp=fopen("c:/temp/work05.txt","w");
    fclose(fp);
    return 1;
    }
    }VOID ServiceStart(DWORD dwArgc, LPTSTR *lpszArgv)
    {
    //服务启动程序
    if ((NULL != (__hRunEvents[0] = CreateEvent(NULL, TRUE, FALSE, NULL))) &&
    (NULL != (__hRunEvents[1] = CreateEvent(NULL, TRUE, TRUE, NULL))))
    {
    REPORTRUNNINGSTATUS
    //WaitForSingleObject(__hRunEvents[0],INFINITE);

    while (TRUE)
    {
    if (WAIT_OBJECT_0 == WaitForMultipleObjects(2, __hRunEvents, FALSE,
    INFINITE)) break;
    else
    {
    if (WAIT_OBJECT_0 == WaitForSingleObject(__hRunEvents[0], 0))
    { // stop
    break;
    } else if (WAIT_OBJECT_0 != WaitForSingleObject(__hRunEvents[1], 0))
    { // pause
    continue;
    } // TODO fill param memset(&param, 0, sizeof(param));
    __listServerThreadParam.AddTail(param);
    if ((nServerThreadCount >= MAXTHREADCOUNT) ||
    (!CreateNewServiceThread(&__listServerThreadParam.GetTail())))
    {
    param = __listServerThreadParam.RemoveTail();
    continue;
    }

    nServerThreadCount ++;
    }
    }

    }
    }