我的在收到数据解析以后呢,不是发送给原来的连入套接字,而是要发送给好几个终端,请问,这里我的线程该如何安排呢,套接字该如何处理呢

解决方案 »

  1.   

    把所有要发的套接字装到一个vector
      

  2.   


    while(1)
    {

    SOCKET  TempSocket=accept(ListenSocket,NULL,NULL);
    m_connectionList.AddTail(TempSocket);
    DWORD   RecvBytes;
    DWORD TransferedBytes;
    DWORD   EventTotal=0;
    DWORD    Flags;
    WSABUF  DataBuf;
    WSAEVENT  EventArray[WSA_MAXIMUM_WAIT_EVENTS];
    WSAOVERLAPPED   AcceptOverlapped;
    TCHAR   Buffer[DATA_BUFSIZE];
    memset(Buffer,0,DATA_BUFSIZE);
    ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
    EventArray[EventTotal]=WSACreateEvent();
    AcceptOverlapped.hEvent=EventArray[EventTotal];
    DataBuf.buf=Buffer;
    DataBuf.len=DATA_BUFSIZE;
    EventTotal++;
    WSARecv(TempSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL);
    while (true)
    {

         DWORD Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
        WSAResetEvent(EventArray[Index-WSA_WAIT_EVENT_0]);
          WSAGetOverlappedResult(TempSocket,&AcceptOverlapped,&TransferedBytes,FALSE,&Flags);
        if(TransferedBytes==0)
    {
    closesocket(TempSocket);
    WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]);
    break;
    }
       else
       {
    m_CCmdBufferDataList.AddTail(CCmdBuffer(LPBYTE(DataBuf.buf), DataBuf.len));
    VERIFY(SendDataToAll()==TRUE);
       }

         Flags=0;
         ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
        AcceptOverlapped.hEvent=EventArray[Index-WSA_WAIT_EVENT_0];
          DataBuf.buf=Buffer;
        DataBuf.len=DATA_BUFSIZE;
              WSARecv(TempSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL);
    }

    }
    CloseHandle(m_hThread);

    return 0;
     加到一个独立的线程中,其中可以将接受连接SOCKET加到一个static 的链表之中,在发送!!
      

  3.   

    如果这种事情频繁发生,那你需要为每个PER_SOCKET_CONTEXT配置两个PER_IO_CONTEXT分别用来发送和接收。并且,发送之前需要检查上次发送是否已经完成,如果没有,需要new一个PER_IO_CONTEXT来容纳新数据并发送。
      

  4.   

    wwwsq(wwwsq) 兄台:
    你能借一份多线程完成端口的例程给我学习一下吗?
    不胜感激!
      

  5.   

    to wwwsq(wwwsq),你说的什么意思呀,能详细一点吗?
      

  6.   

    不好意思,我手上比较完整的代码属于商业代码。学习iocp的话,可以到微软的网站找一个叫 iocp_standard 的例子。到msdn去搜索iocp应该可以找到。