加一个类从CSocket类继承,然后重栽类成员函数,其中有OnRecv,OnSend,等等!

解决方案 »

  1.   

    service: CSocket sockListen;
    sockListen.Create(6802,SOCK_STREAM,"135.10.200.35");
    sockListen.Bind(6801,"135.10.200.35");
    sockListen.Listen(5);
    sockListen.Accept(m_sockSend);
    sockListen.Close();
    SetTimer(1,1000,NULL);
    return TRUE;client等给了分给你
      

  2.   

    service: CSocket sockListen;
    sockListen.Create(6802,SOCK_STREAM,"135.10.200.35");
    sockListen.Bind(6801,"135.10.200.35");
    sockListen.Listen(5);
    sockListen.Accept(m_sockSend);
    sockListen.Close();
    SetTimer(1,1000,NULL);
    return TRUE;client等给了分给你
      

  3.   

    请问sockListen.Bind(6801,"135.10.200.35");是何作用?
      

  4.   

    可用事件选择模型WSAEventSelect
    然后WSAWaitForMultipleEvents等待事件消息
    再用WSAEnumNetworkEvents判断时间消息并针对编写处理程序
      

  5.   

    1.不一定了,如果用阻塞式socket,send()就不会返回,一直等到成功为止,非阻塞式socket,send()立即返回,如果失败就产生错误码,可以用WSAGetLastError()判断错误。系统发出FD_WRITE消息,主要有三种情况:a.使用connect(),一个套接字首次建立了连接 b.使用accept(),套接字被接受以后 c.调用send(),sendto()操作失败,返回错误信息,缓冲区变为用。
    2.如果用CSocket,可以重载OnAccept()函数,在里面处理连接请求就行了。不用WSAAsyncSelect()了,CSocket封装了WSAAsyncSelect(),OnAccept()函数就相当于FD_ACCEPT。
    3.CSocket可以重载几个函数,OnAccept()表示有连接请求,OnReceive()表示缓冲区有数据待接受,OnWrite()和FD_WRITE一样,OnClose()表示连接中断,一般要在这里关闭socket。
        可是哥们,服务器端用窗口消息响应可不行呀,效率太低了,两三台机器玩玩还可以,作为要应付大量访问的服务器,select,WSAAsyncSelect,WSAEventSelect恐怕都跟不上,用overlapped i/o或者iocompletionport吧,效率高多了。
      

  6.   

    大侠们,怪我没说清,我不想用CSocket,和CAsyncSokcet,据说性能不太好。
    我想用winsock提供的接口函数直接做,所以不知道(特别是服务器端)如何
    知道:
    1。listen后什么时候能ACCept(),这个listen() accept()应放在MFC程序中的什么地方
    2. 什么时候知道有消息到来(特别是服务器端),如果服务器端有二个以上的连接,怎么
    才能知道是哪个socket的消息?快回答, 马上给分
      

  7.   

    请问“sunriselx”:overlapped i/o或者iocompletionport应该怎么做?有没有参考资料或者代码?谢谢谢谢
      

  8.   

    是啊,关注高手的overlapped i/o或者iocompletionport,给讲讲也行啊
      

  9.   

    http://www.csdn.net/expert/topicview1.asp
    主  题:多线程WinSock服务器框架程序(源代码),我写的,与大家探讨.
    作  者:zb_china
    所属论坛:Visual C++
    看看吧,也许有帮助.
      

  10.   

    自己看吧,我也不知道怎么说,有问题再讨论。 if(listen(ScadaSocketList[LocalSocketPosi].m_pSocket,1) != 0)
    {
    closesocket(ScadaSocketList[LocalSocketPosi].m_pSocket);
    ScadaSocketList[LocalSocketPosi].m_pSocket = INVALID_SOCKET;
    return FALSE;
    }
    if(WSAAsyncSelect(ScadaSocketList[LocalSocketPosi].m_pSocket,m_hWnd,UM_SOCK,FD_ACCEPT|FD_READ)==SOCKET_ERROR)
    {
    closesocket(ScadaSocketList[LocalSocketPosi].m_pSocket);
    ScadaSocketList[LocalSocketPosi].m_pSocket = INVALID_SOCKET;
    return FALSE;
    }
    LONG CMainFrame::OnSocketMessage(UINT wParam,LONG lParam)
    { int msg=WSAGETSELECTEVENT(lParam); switch(WSAGETSELECTEVENT(lParam))
    {
    case FD_ACCEPT:
    {
    int len;
    SOCKADDR_IN    clientAddr;
    SOCKET sockClient;
    len = sizeof(clientAddr);
    sockClient = accept(ScadaSocketList[LocalSocketPosi].m_pSocket,(struct sockaddr FAR *)&clientAddr,&len);//×èÈûµ÷Óà if(sockClient == -1)
    SocketError();
    else
    {
    for(int i=LocalSocketPosi+1;i<NodeNum;i++)
    {
    if(ScadaSocketList[i].SocketAddr.sin_addr.s_addr == clientAddr.sin_addr.s_addr)
    {
    ScadaSocketList[i].m_pSocket = sockClient;
    ConnectString[i].Format(" %s &frac12;&Oacute;&Ecirc;&Uuml;  %s &micro;&Auml;&Aacute;&not;&frac12;&Oacute;&sup3;&Eacute;&sup1;&brvbar;.......",LocalName,ScadaSocketList[i].NodeName);
    }
    }
    }
    }
    break;
    case FD_READ:
    {
    for(int i=0;i<NodeNum;i++)
    {
    if(i!=LocalSocketPosi)
    {
    if(WSAAsyncSelect(ScadaSocketList[i].m_pSocket,m_hWnd,UM_SOCK,FD_READ|FD_WRITE|FD_ACCEPT)==SOCKET_ERROR)
    {
    closesocket(ScadaSocketList[i].m_pSocket);
    ScadaSocketList[i].m_pSocket = INVALID_SOCKET;
    }
    int len = recv(ScadaSocketList[i].m_pSocket,(char *)RecvBuffer,20,0);
    if(len<=0)
    continue;
    CString szMsg = RecvBuffer;
    RecvNum[i]++;
    RecvString[i].Format("&micro;&Uacute;%3d&acute;&Icirc;%10s&frac12;&Oacute;&Ecirc;&Otilde;&micro;&frac12;&Ecirc;&yacute;&frac34;&Yacute;(%10s)&sup3;&Eacute;&sup1;&brvbar;",RecvNum[i],LocalName,szMsg);
    // TRACE(RecvString[i]);
    break;
    }
    }
    } break; default:
    break;
    }
    return 0;
    }