重叠模式IO的SOCKET 已经实现一server对一client的了 怎么实现一server对应多client的呢
是要用多个WSAOVERLAPPED吗?

解决方案 »

  1.   


    任何一种模型都可以实现1server对多client的
      

  2.   

    重叠模式中的事件通知方法:
      如果你已经知道了一个server对应一个client的实现方法的话.那么对应多个client的话,我想可以另外开一个线程来负责accept().
      

  3.   

    已知的五种socket模型都可以管理多个client。
      

  4.   

    #include <iostream>
    #include <winsock2.h>
    using namespace std;#define WSA_MAX_WAIT_EVENTS 100
    DWORD WINAPI Client(LPVOID);
    int main()
    {
    WORD wsaVersionRequested;
    WSADATA wsaData;
    int err;
    int Index;
    int EventTotal=0;
    char recvbuff[1024];
    DWORD Flags,RecvBytes,ByteTransferred;
    WSABUF DataBuf;
    WSAEVENT EventArray[WSA_MAX_WAIT_EVENTS];
    WSAOVERLAPPED AcceptOverlapped; wsaVersionRequested=MAKEWORD(2,2);
    err=WSAStartup(wsaVersionRequested,&wsaData);
    CreateThread(NULL,0,Client,NULL,0,NULL);

    if(err<0)
    return 0;
    SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

    listen(server,5);

    SOCKADDR_IN addrClt;
    int len=sizeof(SOCKADDR);
    SOCKET AcceptSocket=accept(server,(SOCKADDR*)&addrClt,&len);
    cout << inet_ntoa(addrClt.sin_addr) << endl;
    EventArray[EventTotal]=WSACreateEvent();
    ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
    AcceptOverlapped.hEvent=EventArray[EventTotal];
    DataBuf.len=1024;
    DataBuf.buf=recvbuff;
    EventTotal++;
    int byteRecv=SOCKET_ERROR; WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL); cout << DataBuf.buf << endl;
    while(1)
    {
    Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
    WSAResetEvent(EventArray[Index-WSA_WAIT_EVENT_0]); WSAGetOverlappedResult(AcceptSocket,&AcceptOverlapped,&ByteTransferred,FALSE,&Flags); if(ByteTransferred==0)
    {
    closesocket(AcceptSocket);
    WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]);
    return 0;
    }
    cout << DataBuf.buf << endl;
    Flags=0;
    ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
    AcceptOverlapped.hEvent=EventArray[Index-WSA_WAIT_EVENT_0];
    WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL);
    }

    }DWORD WINAPI Client(LPVOID lpParam)
    {
    WORD wsaVersionRequested;
    WSADATA wsaData;
    int err;
    wsaVersionRequested=MAKEWORD(2,2);
    err=WSAStartup(wsaVersionRequested,&wsaData);
    if(err<0)
    return 0;


    SOCKET client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);
    addrSrv.sin_addr.S_un.S_addr=inet_addr("10.200.121.33");
    while(connect(client,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)));
    cout << "Connected.\n";
    char sendbuff[1024];
    int byteSend=SOCKET_ERROR;
    memset(sendbuff,0x00,1024);
    memcpy(sendbuff,"Hello",sizeof("Hello"));
    cout << sendbuff << endl;
    while(byteSend==SOCKET_ERROR)
    byteSend=send(client,sendbuff,strlen(sendbuff),0);
    cout << WSAGetLastError();
    while(1)
    {
    memset(sendbuff,0x00,1024);
    cin >> sendbuff;
    send(client,sendbuff,strlen(sendbuff),0);
    }

    return 0;
    }
    为什么DataBuf没有改变?