我派生成了一个CSocket类,并listen,后接下来进行其它操作正常,问:1)listen后不是线程不是会进行监听等待吗,何为又可进行后面的操作了?在这个CSocket类中,我重载了OnAccept,客户连接后是否是这个第一个将调用这个成员,在这个OnAccept中我又new 了出了一个CSocket类对象,将这个对象传给,pListenSocket->Accept(*pSocket),注pListenSocket为ListenSocket指针,pSocket为新生成的指针,在新生成的类中,我重载OnReceive,(2)我想知道这一系列的操作中,客户接入后的消息流的过程,或是,哪位老兄给我一点,MFC中的CSocket,CSocketFile 类的消息流的信息,多谢,一定重分加加,网址也可以,

解决方案 »

  1.   

    好像兄弟不太懂网络编程方面的东东。
    你上面所说的确实也是差不多如此做,只是不是这么做的。
    真是一言难说完啊。1.OnAccept是接受连接,client发了一个connect消息后,在服务端需要如此做的。
    2.当然服务端必须先listen着。listen有很多方法,可以用线程的方法,但我建议
        你先使用最基本的方法吧。因为你可能不甚明白。
    3.只有建立连接后,才能一方send另一方receive的动作。所有操作这些动作的当然是
      socket对象,你可以直接使用csocket对象,或继承一下就ok了,它已经写的很多不错了,
      除非你要用ioctl方面的如iocp等。
    4.用csocketfile也是一种方法,且csocketfile有序列化的方法,那样你自己就不用定义一套
      规则或协议来组合消息与解析消息。*_*
      

  2.   

    以下是我的程序,你好好研究一下吧!void CADOTest1Dlg::OnStart() 
    {
    //初始化与绑定服务器
        WSADATA wsaData;
        int iErrorCode;
        if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL

             list.InsertString(0,"Winsock无法初始化!");
             WSACleanup();
             return;
    } list.InsertString(0,"服务器开始创建SOCKET。"); ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信    if(ServerSocket == INVALID_SOCKET)
    {
             list.InsertString(0,"无法创建服务器socket!");
             return;
    }    m_sockServerAddr.sin_family = AF_INET;
        m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;   //向所有的IP地址发送消息
        m_sockServerAddr.sin_port = htons(8001);    if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
        {
        list.InsertString(0,"无法绑定服务器。");
            return;
    }    list.InsertString(0,"服务器端口:8001.");    iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
             // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息    if (iErrorCode == SOCKET_ERROR) 
    {
             list.InsertString(0,"WSAAsyncSelect设定失败!——用于连接请求的消息");
             return;
    }    if (listen(ServerSocket,1) == SOCKET_ERROR) //开始监听客户连接请求
    {
    list.InsertString(0,"服务器监听失败!");
            return;
    } IsTrue = TRUE;  list.AddString("服务器绑定监听成功。");
        return; 

    }LRESULT CADOTest1Dlg::OnAccept(WPARAM wParam,LPARAM lParam)
    {//自定义接收客户机请求的消息   ON_MESSAGE(WM_CLIENT_ACCEPT,OnAccept)
    if (WSAGETSELECTERROR(lParam))
    {
    list.InsertString(0,"Error detected on entry into OnServerAccept.");
    return 0L;
    }

    if(WSAGETSELECTEVENT(lParam) == FD_ACCEPT)//如果
    {
        Client = accept(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0);     if (Client == INVALID_SOCKET)
    {
    list.InsertString(0,"Server socket failed to accept connection.");
    return 0L;
    }

    WSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE); IsTrue = TRUE;
    }

    list.InsertString(0,"有工作站连接上了服务器。");

    return 0L;
    }
      

  3.   

    建议先用socket api自己写一个简单的聊天室程序,有助于你对socket理解。
      

  4.   

    的确讲的有点糊涂,介绍你一篇文章吧
    http://www.meteorlet.com/showinfo.php?type=3&id=30018