我的监听线程是通过WSAEventSelect(FD_ACCEPT|FD_CLOSE)来触发的,每次有FD_ACCEPT过来,我就创建一个新线程。一般情况下,我的程序工作的很好。但有时候当同一客户机有连续请求到达时就会多收到请求。
我的客户机的一段代码:
for( int i = 0; i < nCount; i++)
{
   AfxBeginThread( RequestThread,.....);
}
服务端代码:
for(;;)
{
WSAWaitForMultipleEvents( 1, lphEvents, false, WSA_INFINITE, false);
WSAEnumNetworkEvents( s, hEvent, pEvent);

switch( pEvent->lNetworkEvents )
{
case FD_ACCEPT:     AfxBeginThread( ConnThread, ...)//我是在ConnThread中accept的         break;
case FD_CLOSE:
    break; default:
    return EXIT_FAILURE;
}
如nCount = 2 的时候,我的服务器端经常会收到 3 个请求,结果创建第3个SOCKET的时候就报错了。但有时候又是对的。 这是为什么

解决方案 »

  1.   

    问题是明显的,你的socket没有建立成功,你就用这个socket call其他function.
      

  2.   

    你是说哪里的socket?我知道我ConnThread的socket 没有建立成功的。
    我的问题是为什么我收到的请求数目会比实际请求多
      

  3.   

    可能的话把RequestThread的大致代码贴出来
      

  4.   

    我的RequestThread 有好几种的,连接代码是一样的,这是其中的一个。
    这是一个DirThread,目的是得到服务器指定目录下的文件列表。UINT _cdecl DirThread(LPVOID pParam):pDirParam = (DirParam*)pParam;
    hWnd = pDirParam->hWnd;
    addr.sin_addr.s_addr = inet_addr( pDirParam->strServerIP );
    addr.sin_family = AF_INET;
    addr.sin_port = htons(pDirParam->nPort);s = socket(AF_INET, SOCK_STREAM, 0);
    ASSERT( s != INVALID_SOCKET );
    nResult = connect(s, (sockaddr*)&addr, sizeof(sockaddr_in));
    if ( nResult == SOCKET_ERROR )
    {
    //nErr = WSAGetLastError();
    AfxMessageBox("连接失败,请检查网络");
    ReleaseMutex( pDirParam->hMutex);
    delete pDirParam;
    closesocket(s);
    return EXIT_FAILURE;
    }基本就是这样,我这个问题已经搞了好几天了,大家请帮忙,讨论一下
      

  5.   

    for( int i = 0; i < nCount; i++)
    {
       AfxBeginThread( RequestThread,.....);
    sleep (5000)
    }连接了然后等一下嘛太快了,服务端的WSAEnumNetworkEvents也许会重富
      

  6.   

    还有你用netstat -a 看看端口的使用情况。
      

  7.   

    -》 fbmsf(FBM):如果是很多的那种,你就要更换用更复杂的接受方式了,比如 完全端口模型。你的 很多的那种 是指客户端很多吗?为什么我多收到请求呢?是什么原因呢?
    完成端口模型能保证不会多收到请求吗?我以前还有个50分的帖子,也是这个问题的,解决了一起给分。
      

  8.   

    就是客户端很多的意思,比如0.1秒里有50个客户连入。
    你多收到请求,我没有遇到过的,我在主线程里用的accept
    还有就是
    FD_ACCEPT   Want to receive notification of incoming connections
    FD_CONNECT Want to receive notification of completed connection
    注意一下他们的区别。
      

  9.   

    我在主线程里用的accept,阻塞的。
    accept 一个,就建一个线程。
      

  10.   

    我是在新建的线程中accept,可我觉得这样也没什么问题呀。那你觉得我多收到线程是不是跟我这种做法有关呢?