我要用CSocket做一个项目,但是初次接触这个东西(本人对mfc亦不太熟悉),几个问题请教:
1:为了简便起见,不准备使用多线程,本项目是两个程序之间互传数据,准备采用TCP传送,这样可以用所谓的异步方式么?
2:我查了查资料,异步方式服务器端在收到数据后会自动调用ONRECEIVE()函数,我是应该在这个函数中调用receive()么?
3:我需要在一个对话框窗口中使用该CSOCKET对象?如何添加?用不用为该窗口添加信的消息处理程序?
我在mfc方面算是个新手,请详细说明添加过程(开发平台Visual C++.net).
4:请详细说明服务端和客户端收发数据的过程(在程序中实现的过程,有关的网络只是我了解:)
5:有简单的源代码请提供,万分感谢

解决方案 »

  1.   

    1: 这个是异步方式
    2: 对
    3: 加个CSocket的派生类对象成员就行了.收发数据在该类中实现
    4: .... 查查资料吧, 详细说要说到什么时候啊, MSDN上就很详细了.
    5: 网上有,我一般不用这个类附: 用定时器,在OnTime消息里发送
      

  2.   

    CSocket的用法:
    http://www.51one.net/info/4537196585245347.htm
    设置定时器: SetTimer(...);
      

  3.   

    http://www.blindpoint.net/bbs/ShowForum.asp?forumid=7
      

  4.   

    to  krh2001(边城浪子)
    这个贴我以前看到过
      

  5.   

    http://www.51one.net/info/4537196585245347.htm
    很详细
      

  6.   

    CSocket是阻塞方式的套接字,CAsyncSocket是非阻塞方式的套接子。
    1. 这两个东西用那个都行。我觉得它们的只是在Connect有区别,一个等待返回,一个立刻返回,一旦连接成功,调用OnConnect方法。
    2. 这两个东西都会自动调用OnReceive(),当某方Send东西过来时,都会调用该方法。
    3. 要在该类创建出的对象的方法中覆盖原来的方法,不是在窗口对象里实现的。
    4. 客户端窗口类中:
    class CMycliDlg : public CDialog
    {
    CHLXSocket *m_sockcli;
    ...
    ...
    ...};
    BOOL CMycliDlg::OnInitDialog()
    {
    ...
    ...
    m_sockcli = new CHLXSocket(); //创建对象

    //连接服务器
    if (m_sockcli ->Connect (strIpaddr,m_port))
    {
     //处理连接成功
    }
    else 
    {
    处理连接失败
         delete m_sockcli;
    m_sockcli =NULL;
    return;
    }}//CSOCKET类中
    class CHLXSocket : public CSocket
    {public:
    CHLXSocket();
    virtual ~CHLXSocket();
    BOOL Init(void); virtual void OnClose(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    };BOOL CHLXSocket::Init(void)
    {
    //初始化,创建一个端口
    if (Create())
    return TRUE;
    else
    return FALSE;
    }
    void CHLXSocket::OnReceive(int nErrorCode) 
    {
    //处理从服务器端发送过来的数据
    CSocket::OnReceive(nErrorCode);
    }void CHLXSocket::OnClose(int nErrorCode) 
    {
    //处理服务器端断开的事件
    CSocket::OnClose(nErrorCode);
    }服务器端类似
    服务器端最好可以创建两个套接字对象,一个用来Listen, 用另一个来创建跟客户端的连接
    class CLsnSock : public CAsyncSocket
    { friend class CSvrSock;public:
    CLsnSock();
    virtual ~CLsnSock();
    bool InitSocket(UINT uPort); virtual void OnAccept(int nErrorCode);};bool CLsnSock::InitSocket (UINT uPort)
    {
    ASSERT(uPort > 0); if (!AfxSocketInit())
    {
    m_iErrorCode = SOCKETS_INIT_FAILED;
    return false;
    }
    else
    {
    //to create a socket with a input port number.
    if (Create(uPort))   //创建服务器(有端口号)
    {
    //to Listen the port.
    if (Listen(5))  //侦听连接即客户端的CONNECT
    {
    ....
    }
    else
    {
    ....
    }
    }
    else
    {
    ....
    }
    }
    }
    void CLsnSock::OnAccept(int nErrorCode) 
    {
    *pAcpCltSock = new CSvrSock ; if (Accept(*pAcpCltSock))  //与客户端建立起了连接
    {
    ...
    }
    else  //不成功
    {
    ...
    }... CAsyncSocket::OnAccept(nErrorCode);
    }
    class CSvrSock : public CAsyncSocket
    {friend class CLsnSock;
    virtual void OnClose(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    private:
    CLsnSock *m_pLsnSock;
    ...
    };
     
    void CSvrSock::OnReceive(int nErrorCode) 
    {
    处理接收客户端发送的数据
    }void CSvrSock::OnClose(int nErrorCode) 
    {
    处理客户端的断开
    CAsyncSocket::OnClose(nErrorCode);
    }