前几天问过了Accept()问题,还是没有怎么搞懂,望大家再指点一下。
我还是把流程再说一下:
A机发起:A->本地->B->本地->A
B机发起:B->本地->本地->B
A机与本机通信结构为SQLL_PACK_STRUCT
B机与本机通信结构为CC_PACK_STRUCT
A机IP地址198.0.0.88,通信端口8088
B机IP地址为198.0.0.66,通信端口8066下面的代码我实行了A机发起的过程,不过A机只能发送一次,发送第二次代码就出错了。
如果B机也同时发起,需要在哪里加些代码,我真的需要大家的帮助,急死了!!!SLZZ_PACK_STRUCT FromA;
CC_PACK_STRUCT ToB;
SLZZ_PACK_STRUCT BackA;
BOOL CBtoBDlg::OnInitDialog()
{
m_SocketFromA=new CListeningSocket(this);
m_SocketFromA->Create(8088);
if(!m_SocketFromA->Listen())//侦听A主机
{
AfxMessageBox("侦听A主机失败");
return true;
}}
void CBtoBDlg::OnAccept()
{
CClientSocket *pSocket=new CClientSocket(this);
if(!m_SocketFromA->Accept(*pSocket))
{
AfxMessageBox("接受A主机失败");
delete pSocket;
}

}void CBtoBDlg::OnReceive(CClientSocket* pSocket)
{
char recvbuf[1024];
pSocket->Receive(recvbuf,sizeof(SLZZ_PACK_STRUCT),0);
char* pbuf=(char*)recvbuf;
memcpy(&FromA,pbuf,sizeof(SLZZ_PACK_STRUCT));
switch(atoi(FromA.TrType))//交易类别
{
case 1:
break;
default:
//插入本地数据库
AddVouch(FromA.TrType,FromA.BankSer);
break;
}
//连接B机
m_SocketToB=new CSocket;
if(!m_SocketToB->Create())
{
delete m_SocketToB;
m_SocketToCB=NULL;
AfxMessageBox("套接字创建错误");
}
while(!m_SocketToCredit->Connect("198.0.0.66,8066))
{
AfxMessageBox("无法连接服务器");
delete m_SocketToCredit;
m_SocketToCredit=NULL;
}
//发送数据到B机
m_SocketToB->SendToB();
//从B机数据返回本机,修改数据库
m_SocketToB->ReceiveFromB()
//返回A机
char backbuf[423];
memcpy(backbuf,&BackA,sizeof(SLZZ_PACK_STRUCT));
pSocket->Send(backbuf,sizeof(SLZZ_PACK_STRUCT),0);

}

解决方案 »

  1.   

    我看你的思路比较乱:
    我建议更改你的总体设计:
    大体这样:
    把本地的机器作为服务器它监听客户端,A、B机都作为客户端当它们之间传递数据的时候通过服务器来传递,否则你的程序中有很多的Tcp/IP连接不乱么?
      

  2.   

    我也不明白你的意思,说一下我的做法,希望对你有帮助。
    整个通信程序分成两个部分:server和client,当然是逻辑上的。
    server负责listen然后accept,client要先和server去connect然后
    被server接受(accept)后才可以进行通信。
    这样只是说你可以用socket收发数据,并不等于你就可以开发出通信
    程序了,这个要提醒你,否则你的挫折感会非常大的。