您好,不好意思打搅您!
    我这个程序(附接口说明)
    A机IP地址:9.97.155.110,端口:9999
    B机IP地址:198.0.0.68,端口:8080
    本地侦听端口:8888
流程大概如下:
    A机发起:A机->本地(拆包,存数据库,打包,发送到B机)->B机接收处理->返回->本地(拆包,修改数据库,打包到A机)->A机
    B机发起:流程刚好跟A机发起相反。
我是初接触VC一个月差不多,所以对Socket起有点模糊,也搞不清,弄了好长时间还是不太懂。周围的人也没有怎么懂的,所以才出此下策。
在本地服务器的主对话框的:
void CBtoBDlg::OnInitDialog()
{
         //初始化数据库
           ......
m_SocketListen=new CListeningSocket(this);
m_SocketListen->Create(8888);
if(!m_SocketListen->Listen())
{
m_Bar.SetPaneText(1,_T("侦听失败......"));
return true;
}
    return true;
}
//CListeningSocket和CClientSocket类从CSocket类派生出来,重载OnAccept()和OnReceive()
//接收客户机A和B
void CBtoBDlg::OnAccept()
{
CClientSocket *pSocket=new CClientSocket(this);
if(m_SocketListen->Accept(*pSocket))
{
m_ConnectionList.AddTail(pSocket);
}
else
delete pSocket;
}
void CBtoBDlg::OnReceive(CClientSocket* pSocket)
{
//到这里我就搞糊涂了,我怎么知道是A发来呢还是B发来呢
如果A发来,我拆包插数据表AtoB,再处理,如果处理失败马上返回给A出错信息,处理成功则发给B,B处理返回到本地修改数据库,再组包发送给A,这样一笔交易算完成。
//如果B发来,则相反,除了数据库是BtoA吧了。
//好像从一些资料上看到用getpeername得到IP地址来判断???}
您能否帮我看看,万分感谢!!!我现在居然一条线路一个程序,就是说有二个程序在运行,一个用来接收A发起的,一个用来接收B发起的,连我自己感觉都很可笑!

解决方案 »

  1.   

    我也被你说的糊里糊涂的了,不过大概是这样:
    你的A和B是同一个程序还是分为服务器和客户机?
    1.要是分开的服务器和客户机,那就不用想这么多了,建立连接后在B上只管接收,然后(拆包,修改数据库,打包到A机),A上只管发送数据包。
    2.如果你的程序是服务器和客户机共用一个程序,那么你在初始化程序的时候做一个标志,标明启用的是A还是B,在OnReceive()中用个判断语句就可以了
    void CBtoBDlg::OnReceive(CClientSocket* pSocket)
    {
         if(m_bAorB)//m_bAorB是用来标明启用的是A还是B的bool变量
         {
          //如果是启用A,则按A的处理方法处理
          }
          else
          {
           //如果是启用B,则按B的处理方法处理
           }  
    }