我正在做一个接口程序.要求:一个控制器(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);
}不知道这样是不是可以实现实时数据传输?
我做这个没有什么经验,请大家多多帮助.
如果可能,请多介绍一些,最好能给出实例.
非常感谢.

解决方案 »

  1.   

    能不能实现测试一下就可以知道了啊。
    用winsocket可以比较容易就实现了数据之间的传输
      

  2.   

    我测试了,有问题啊!问题已经在上文中写出了.主要是,客户端链接是,总是显示链接不成功.
    服务器端能接受到请求,并调用Onaccept(),但是不能接受数据.
      

  3.   

    虽然我很反感CAsyncSocket,但是我想基本原理还是一样的楼主的服务器端是不是没有在OnAccept里面写代码客户端的connect请求是由onAccept里面的代码来处理的
      

  4.   

    而且不应该在有数据发出的时候再connect,而是应该在客户端初始化的时候就把socket建立好,然后再和服务器端做连接,成功以后再考虑发数据的问题
      

  5.   

    谢谢 PiggyXP(【小猪】●享受VC,享受网络版●) ,但是我在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()就可以了是吗?
      

  6.   

    AsyncSelect(FD_READ);
    是谁在AsyncSelect(FD_READ);????
    你客户端没有调用 asyncselect方法啊
      

  7.   

    asyncselect(FD_READ)是服务器端读数据.客户端是不是要asyncselect(FD_WRITE)?这样如果我客户端每send()一次,服务器端能自动调用recv()呢?
      

  8.   

    你的想法比较可行,而且,用CAsyncSocket相对来说简单一些
    你可以去下载这个例子看看,但你最好明白Windows的消息机制哦
    非常经典的例子:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;192570