我正在做一个接口程序.要求:一个控制器(client)和一个模拟软件(server)之间实现实时传输数据,需要实现单向数据传输(客户端到服务器).请问怎么实现基于TCP/IP的通讯程序?socket怎么设计比较合理?
我目前用mfc的类CAsyncSocket派生了三个类,一个在服务器端侦听的socket,还有一个在服务器端等待接受数据的socket,最后一个是客户端的socket.理论通讯模型:控制器->共享缓冲区(属于控制器的,有专门语言控制)->tcp/ip通讯->共享缓冲区->模拟软件我程序设计思路是这样的:
1.服务器端首先创建<Create()>一个用于侦听的socket,绑定bind()<bind()的参数我不知道怎么给出.bind(1080)这样可以吗?不绑定可不可以?不绑定有什么后果?>,让后侦听listen(). 2.客户端,当控制器(客户端)有发出数据的时候,c++程序能得到一个消息.从而创建<Create()>一个socketsocket,连接服务器<connet()>.--这里有个问题,总是显示链接不成功,但是在服务器端的OnAccept()确能被调用.我的程序是这样的:{
TClientSocket *ClientSocket; ClientSocket=new TClientSocket(this);
UpdateData(TRUE);
bConnected=FALSE;
if (!ClientSocket->Create())
{ AfxMessageBox("Create Failed!");delete ClientSocket;return;}
if (!ClientSocket->Connect("129.187.159.111",1080))
{AfxMessageBox("Connect Failed!");delete ClientSocket;return;}
}我的OnSend()如下:
void TClientSocket::OnSend(int nErrorCode)
{
Send(m_szBuffer,m_nLength,0);//从缓冲区发送数据
memset(m_szBuffer,0, m_nLength);
m_nLength =0;
}
CAsyncSocket::OnSend(nErrorCode);
} 3.服务器端接受到客户端的的链接请求,调用OnAccept(),在OnAccept()这个程序中,我这样写的:
TRecSocket *RecSocket;一个专门接受的Socket,已经在头文件定义.
void TServerSocket::OnAccept(int nErrorCode)
{
AfxMessageBox("Socket OnAccept() go!");
RecSocket=new TRecSocket();
if (Accept(*RecSocket) AsyncSelect(FD_READ);
else delete RecSocket
CAsyncSocket::OnAccept(nErrorCode);
}我的OnReceive()是这样写的:
void TServerSocket::OnReceive(int nErrorCode)
{
AfxMessageBox("Socket OnReceive() go!");
m_nLength=Rec->Receive(m_szBuffer,sizeof(m_szBuffer),0);
for(UINT i=0;i<m_nLength;i++)
{
m_pDlg->m_MSG+=m_szBuffer[i];//在一个窗口,用一个Edit Box观察传送过来的数据
}
m_pDlg->UpdateData(FALSE);
CAsyncSocket::OnReceive(nErrorCode);
}不知道这样是不是可以实现实时数据传输?
我做这个没有什么经验,请大家多多帮助.
如果可能,请多介绍一些,最好能给出实例.
非常感谢.
我目前用mfc的类CAsyncSocket派生了三个类,一个在服务器端侦听的socket,还有一个在服务器端等待接受数据的socket,最后一个是客户端的socket.理论通讯模型:控制器->共享缓冲区(属于控制器的,有专门语言控制)->tcp/ip通讯->共享缓冲区->模拟软件我程序设计思路是这样的:
1.服务器端首先创建<Create()>一个用于侦听的socket,绑定bind()<bind()的参数我不知道怎么给出.bind(1080)这样可以吗?不绑定可不可以?不绑定有什么后果?>,让后侦听listen(). 2.客户端,当控制器(客户端)有发出数据的时候,c++程序能得到一个消息.从而创建<Create()>一个socketsocket,连接服务器<connet()>.--这里有个问题,总是显示链接不成功,但是在服务器端的OnAccept()确能被调用.我的程序是这样的:{
TClientSocket *ClientSocket; ClientSocket=new TClientSocket(this);
UpdateData(TRUE);
bConnected=FALSE;
if (!ClientSocket->Create())
{ AfxMessageBox("Create Failed!");delete ClientSocket;return;}
if (!ClientSocket->Connect("129.187.159.111",1080))
{AfxMessageBox("Connect Failed!");delete ClientSocket;return;}
}我的OnSend()如下:
void TClientSocket::OnSend(int nErrorCode)
{
Send(m_szBuffer,m_nLength,0);//从缓冲区发送数据
memset(m_szBuffer,0, m_nLength);
m_nLength =0;
}
CAsyncSocket::OnSend(nErrorCode);
} 3.服务器端接受到客户端的的链接请求,调用OnAccept(),在OnAccept()这个程序中,我这样写的:
TRecSocket *RecSocket;一个专门接受的Socket,已经在头文件定义.
void TServerSocket::OnAccept(int nErrorCode)
{
AfxMessageBox("Socket OnAccept() go!");
RecSocket=new TRecSocket();
if (Accept(*RecSocket) AsyncSelect(FD_READ);
else delete RecSocket
CAsyncSocket::OnAccept(nErrorCode);
}我的OnReceive()是这样写的:
void TServerSocket::OnReceive(int nErrorCode)
{
AfxMessageBox("Socket OnReceive() go!");
m_nLength=Rec->Receive(m_szBuffer,sizeof(m_szBuffer),0);
for(UINT i=0;i<m_nLength;i++)
{
m_pDlg->m_MSG+=m_szBuffer[i];//在一个窗口,用一个Edit Box观察传送过来的数据
}
m_pDlg->UpdateData(FALSE);
CAsyncSocket::OnReceive(nErrorCode);
}不知道这样是不是可以实现实时数据传输?
我做这个没有什么经验,请大家多多帮助.
如果可能,请多介绍一些,最好能给出实例.
非常感谢.
用winsocket可以比较容易就实现了数据之间的传输
服务器端能接受到请求,并调用Onaccept(),但是不能接受数据.
void TServerSocket::OnAccept(int nErrorCode)
{
AfxMessageBox("Socket OnAccept() go!");
RecSocket=new TRecSocket();
if (Accept(*RecSocket) AsyncSelect(FD_READ);
else delete RecSocket
CAsyncSocket::OnAccept(nErrorCode);
}你的意思是:客户端socket在客户端初始化的时候就开上,一直不关闭,直到我关闭客户端对吗?当客户端要发数据的时候,就只要触发OnSend()就可以了是吗?
是谁在AsyncSelect(FD_READ);????
你客户端没有调用 asyncselect方法啊
你可以去下载这个例子看看,但你最好明白Windows的消息机制哦
非常经典的例子:
http://support.microsoft.com/default.aspx?scid=kb;en-us;192570