在FD_READ中 接收大文件 ,但是FD_READ是单线程处理,如果有其他连接要发数据只能等待
为什么我开了线程在进行文件接收中 WAITFORMULTIPLEEVENTS的时候 总是没有可用信号

解决方案 »

  1.   

    "为什么我开了线程在进行文件接收中 WAITFORMULTIPLEEVENTS的时候 总是没有可用信号"
    因为还没有client发数据给你现在。你可以写一个client,发送数据给你选择的这个程序。应该就会有信号了。参考:
    Windows Socket五种I/O模型——代码全攻略(一)(转)
    http://hi.baidu.com/xyh2007/blog/item/7f2ebf3de1e69e07bba1674e.html
      

  2.   

    不是的
    我有一个客户端的程序发送数据的,只是我在FD_READ中再开个线程进行接收文件
    代码是
    DWORD Index, i; WSANETWORKEVENTS Events;
    char buffer[4096];
    SOCKET Accept;
    Index = WSAWaitForMultipleEvents(EventTotal,
            EventArray, FALSE, 300, FALSE);

    if (WSA_WAIT_TIMEOUT==Index||WSA_WAIT_FAILED==Index)
    {

    return FALSE;
    }

        Index = Index - WSA_WAIT_EVENT_0;

    for(i=Index; i < EventTotal ;i++)
    {
    Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 300, 
    FALSE);
    if ((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT))
    {

    continue;
    }
    else
    {
    Index = i;
    WSAEnumNetworkEvents(SocketArray[Index],EventArray[Index], &Events);


    if (Events.lNetworkEvents & FD_ACCEPT)

    if (Events.iErrorCode[FD_ACCEPT_BIT] != 0)
    {
    break;
    }

    // Accept a new connection, and add it to the
    // socket and event lists
    Accept = accept(SocketArray[Index], NULL, NULL);

    if (Accept==INVALID_SOCKET)
    {
    WSACleanup();
    return FALSE;
    }

    // WSA_MAXIMUM_WAIT_EVENTS sockets, so close the accepted socket
     
    if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
    {
    //printf("Too many connections");

    closesocket(Accept);
    break;
    }

    NewEvent = WSACreateEvent();

    WSAEventSelect(Accept, NewEvent,
     FD_READ| FD_CLOSE);

    EventArray[EventTotal] = NewEvent;
    SocketArray[EventTotal] = Accept;
    EventTotal++;

    //AfxBeginThread(CEveSock::AcceptProc,(LPVOID)&Accept);
    }
    if (Events.lNetworkEvents & FD_READ)
    {
    if (Events.iErrorCode[FD_READ_BIT] != 0)
    {
    break;
    }
    // Read data from the socket

    recv(SocketArray[Index],buffer,sizeof(buffer),0);

    TRACE("READ");
    }
    if (Events.lNetworkEvents & FD_CLOSE)
    {
    if (Events.iErrorCode[FD_CLOSE_BIT] != 0)
    {
    break;
    }
    CleanSocket(Index);
    }
    }
    } return TRUE;
      

  3.   

    象这样写 可以接收到数据
    但是如果在FD_READ中 如果AFXBEGINTHREAD 好象就什么数据都收不到了
      

  4.   

    接收大文件的话 如果只能在FD_READ中while的话 那就是单线程了  后续客户端的数据都没法在这个完成之前进行传输
    对于小数量的连接 还是select模型传的快  以前写过一个SELECT 模型的 就是select之后 accept客户端 然后马上开线程在里面做循环读数据 
      

  5.   

    不明白楼主为什么在这里调用了两次的WSAWaitForMultipleEvents
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, 300, FALSE); 
    Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 300, FALSE); 其实只要第一句话就可以根据WSAWaitForMultipleEvents函数的返回值来判断是哪个socket有响应请求
    我觉得第一句的WSAWaitForMultipleEvents有问题,因为在这个等待之前EventArray里面并没有实际的事件对象
      

  6.   

    但是我觉得如果不加第1句的话 那WSAWaitForMultipleEvents第2个参数一定是作为全局变量来使用 ,而且只能对一个连接进行触发 不知道这样理解对不对
      

  7.   

    现在主要的问题是 我想在FD_READ中开线程来循环接收文件
    不知道这样行不行
      

  8.   

    WSAWaitForMultipleEvents意思是监控EventArray数组中的所有事件,如果其中某个事件被触发,它就返回,并且返回其中
    被触发事件的下标(用返回值-WSA_WAIT_EVENT_0)找对应的事件