我要用CSocket做一个项目,但是初次接触这个东西(本人对mfc亦不太熟悉),几个问题请教:
1:为了简便起见,不准备使用多线程,本项目是两个程序之间互传数据,准备采用TCP传送,这样可以用所谓的异步方式么?
2:我查了查资料,异步方式服务器端在收到数据后会自动调用ONRECEIVE()函数,我是应该在这个函数中调用receive()么?
3:我需要在一个对话框窗口中使用该CSOCKET对象?如何添加?用不用为该窗口添加信的消息处理程序?
我在mfc方面算是个新手,请详细说明添加过程(开发平台Visual C++.net).
4:请详细说明服务端和客户端收发数据的过程(在程序中实现的过程,有关的网络只是我了解:)
5:有简单的源代码请提供,万分感谢
1:为了简便起见,不准备使用多线程,本项目是两个程序之间互传数据,准备采用TCP传送,这样可以用所谓的异步方式么?
2:我查了查资料,异步方式服务器端在收到数据后会自动调用ONRECEIVE()函数,我是应该在这个函数中调用receive()么?
3:我需要在一个对话框窗口中使用该CSOCKET对象?如何添加?用不用为该窗口添加信的消息处理程序?
我在mfc方面算是个新手,请详细说明添加过程(开发平台Visual C++.net).
4:请详细说明服务端和客户端收发数据的过程(在程序中实现的过程,有关的网络只是我了解:)
5:有简单的源代码请提供,万分感谢
2: 对
3: 加个CSocket的派生类对象成员就行了.收发数据在该类中实现
4: .... 查查资料吧, 详细说要说到什么时候啊, MSDN上就很详细了.
5: 网上有,我一般不用这个类附: 用定时器,在OnTime消息里发送
http://www.51one.net/info/4537196585245347.htm
设置定时器: SetTimer(...);
这个贴我以前看到过
很详细
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);
}