客户端和服务器端通信几次后就不行了 在winsock基于TCP通信程序中,客户端和服务器端可以通信几次,然后,服务器端就不能接收到客户端发送的信息,但是跟踪显示,客户端发送成功了,这种情况应该怎么解决呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器端每次都发相同的数据,放在pcSendBuf里。 pcSendBuf[0] = 'Z'; pcSendBuf[1] = 0xFF; pcSendBuf[2] = 0xFF; pcSendBuf[3] = 0xA1; pcSendBuf[4] = 0x00; pcSendBuf[5] = 0x04; pcSendBuf[6] = 'b'; pcSendBuf[7] = 'a'; pcSendBuf[8] = 'b'; pcSendBuf[9] = 'y'; pcSendBuf[10] = NULL;服务器根据客户端发送的信息,判断是重发,还是发下一条信息。void CMyServerDlg::OnReceive(CMySocket *pSocket){ Sleep(100); m_lstShowMsg.AddString(""); m_lstShowMsg.AddString("have received!"); unsigned char *pBuf = new unsigned char[1025]; // 接收同步字符 int i; int nRevBytes = pSocket->Receive(pBuf, 1024, MSG_PEEK); for(i=0; i<nRevBytes; i++) //找同步字符0xFF的位置 { if(0xFF==pBuf[i] && (0xF1==pBuf[i+1] || 0xF0 == pBuf[i+1])) { break; //跳出for循环 } } pSocket->Receive(pBuf, i); // 清除0xFF以前的字符 if (i< nRevBytes) // 找到同步字符 { nRevBytes = pSocket->Receive(pBuf, 4); if (pBuf[1] == 0xF0) // 将数据重发 { m_lstShowMsg.AddString("failure!"); int ii, kk; kk = m_sAcceptSocket.GetCount(); for (ii=0; ii<kk; ii++) { nErr = m_sAcceptSocket.GetAt(m_sAcceptSocket.FindIndex(ii))->Send(pcSendBuf, 10); AfxMessageBox("重发!"); } delete []pName; delete []pBuf; return; } else if (pBuf[1] == 0xF1) // 发送成功,继续发送下一帧 { m_lstShowMsg.AddString("success!"); SendData(); delete []pName; delete []pBuf; return; } }}客户端接受服务器发送的帧,提取出数据内容:void CMyClientDlg::OnReceive(){ Sleep(100); switch(m_nRevState) { case STATE_NULL: // 搜索同步字符0xFF { int i; CString strReceived; m_nRevBytes = m_ClientSocket.Receive(pBuf, 1024, MSG_PEEK); for(i=0; i<m_nRevBytes; i++) //找同步字符0xFF的位置 { if(0xFF==pBuf[i] && 0xA1==pBuf[i+1]) { break; //跳出for循环 } } m_ClientSocket.Receive(pBuf, i); // 清除0xFF以前的字符 if (i<m_nRevBytes) // 找到了同步字符,更改状态 { m_nRevState = STATE_SYN; } m_nRevBytes = 0; break; } case STATE_SYN: // 搜索帧头 { m_nRevBytes = m_ClientSocket.Receive(pBuf, 4); if (m_nRevBytes < 4) // 接受失败,要求重发 { puchSendBuf[0] = 0xFF; puchSendBuf[1] = 0xF0; puchSendBuf[2] = 0x00; puchSendBuf[3] = 0x00; m_ClientSocket.Send(puchSendBuf, 4); m_lstShowMsg.AddString("resend!\n"); m_nRevState = STATE_NULL; m_nRevBytes = 0; break; } if (pBuf[0]==0xFF && pBuf[1]==0xA1) { m_unFraLen = pBuf[2]; m_unFraLen <<= 8; m_unFraLen += pBuf[3]; m_nRevState = STATE_REV; m_nRevBytes = 0; } else { m_nRevState = STATE_NULL; m_nRevBytes = 0; } break; } case STATE_REV: // 接受数据 { m_lstShowMsg.AddString("have received!"); m_nRevBytes = m_ClientSocket.Receive(ucRev, m_unFraLen); if ((UINT)m_nRevBytes<m_unFraLen) { puchSendBuf[0] = 0xFF; puchSendBuf[1] = 0xF0; puchSendBuf[2] = 0x00; puchSendBuf[3] = 0x00; m_ClientSocket.Send(puchSendBuf, 4); m_lstShowMsg.AddString("resend!\n"); m_nRevState = STATE_NULL; m_nRevBytes = 0; break; } ucRev[m_nRevBytes] = NULL; m_nCount++; CString strShow ; strShow.Format("%d ", m_nCount); strShow += ucRev; m_lstShowMsg.AddString(strShow); m_unFraLen = 0; m_nRevState = STATE_NULL; puchSendBuf[0] = 0xFF; puchSendBuf[1] = 0xF1; puchSendBuf[2] = 0x00; puchSendBuf[3] = 0x00; if (m_ClientSocket.Send(puchSendBuf, 4)==4) { m_lstShowMsg.AddString("send success!"); m_lstShowMsg.AddString(""); } m_nRevState = STATE_NULL; m_nRevBytes = 0; break; } }} 请检查socket listen(参数).参数是不是取得默认值,系统默认值为5个连接,大于就会出现阻塞.或者是你在接收到连接请求后没有产生新的socket实例.如果需要我给你部分代码. 在VC++里怎么定义一个变量 关于托盘中气球提示的实现中遇到的问题,显示不出来气球。。。。 我用DialogBox函数产生的对话框,怎样更改窗口的ClassName? 如何更改程序和标题栏的图标呢? 单文档view中,如果我要初始SetTimer应该放那个方法中阿 高分:多线程串口操作?up有分 如何得到一个盘符属于哪个硬盘,并且知道该盘符所对应的是该硬盘的哪个分区? windows应用程序的菜单竟然能通过xml文件配置! 求多物体随机运动示例 请教如何在Dll中相应消息和发送消息???? 荐客活动:收集精华帖(置顶,结束时间:十月中旬) 在构造函数里不能放置SetTimer ?
pcSendBuf[0] = 'Z';
pcSendBuf[1] = 0xFF;
pcSendBuf[2] = 0xFF;
pcSendBuf[3] = 0xA1;
pcSendBuf[4] = 0x00;
pcSendBuf[5] = 0x04;
pcSendBuf[6] = 'b';
pcSendBuf[7] = 'a';
pcSendBuf[8] = 'b';
pcSendBuf[9] = 'y';
pcSendBuf[10] = NULL;
服务器根据客户端发送的信息,判断是重发,还是发下一条信息。
void CMyServerDlg::OnReceive(CMySocket *pSocket)
{
Sleep(100);
m_lstShowMsg.AddString("");
m_lstShowMsg.AddString("have received!"); unsigned char *pBuf = new unsigned char[1025]; // 接收同步字符
int i;
int nRevBytes = pSocket->Receive(pBuf, 1024, MSG_PEEK);
for(i=0; i<nRevBytes; i++) //找同步字符0xFF的位置
{
if(0xFF==pBuf[i] && (0xF1==pBuf[i+1] || 0xF0 == pBuf[i+1]))
{
break; //跳出for循环
}
}
pSocket->Receive(pBuf, i); // 清除0xFF以前的字符
if (i< nRevBytes) // 找到同步字符
{
nRevBytes = pSocket->Receive(pBuf, 4);
if (pBuf[1] == 0xF0) // 将数据重发
{
m_lstShowMsg.AddString("failure!");
int ii, kk;
kk = m_sAcceptSocket.GetCount();
for (ii=0; ii<kk; ii++)
{
nErr = m_sAcceptSocket.GetAt(m_sAcceptSocket.FindIndex(ii))->Send(pcSendBuf, 10);
AfxMessageBox("重发!");
}
delete []pName;
delete []pBuf;
return;
}
else if (pBuf[1] == 0xF1) // 发送成功,继续发送下一帧
{
m_lstShowMsg.AddString("success!");
SendData();
delete []pName;
delete []pBuf;
return;
}
}
}
客户端接受服务器发送的帧,提取出数据内容:
void CMyClientDlg::OnReceive()
{
Sleep(100);
switch(m_nRevState)
{
case STATE_NULL: // 搜索同步字符0xFF
{
int i;
CString strReceived;
m_nRevBytes = m_ClientSocket.Receive(pBuf, 1024, MSG_PEEK);
for(i=0; i<m_nRevBytes; i++) //找同步字符0xFF的位置
{
if(0xFF==pBuf[i] && 0xA1==pBuf[i+1])
{
break; //跳出for循环
}
}
m_ClientSocket.Receive(pBuf, i); // 清除0xFF以前的字符 if (i<m_nRevBytes) // 找到了同步字符,更改状态
{
m_nRevState = STATE_SYN;
}
m_nRevBytes = 0;
break;
}
case STATE_SYN: // 搜索帧头
{
m_nRevBytes = m_ClientSocket.Receive(pBuf, 4); if (m_nRevBytes < 4) // 接受失败,要求重发
{
puchSendBuf[0] = 0xFF;
puchSendBuf[1] = 0xF0;
puchSendBuf[2] = 0x00;
puchSendBuf[3] = 0x00;
m_ClientSocket.Send(puchSendBuf, 4);
m_lstShowMsg.AddString("resend!\n");
m_nRevState = STATE_NULL;
m_nRevBytes = 0;
break;
}
if (pBuf[0]==0xFF && pBuf[1]==0xA1)
{
m_unFraLen = pBuf[2];
m_unFraLen <<= 8;
m_unFraLen += pBuf[3];
m_nRevState = STATE_REV;
m_nRevBytes = 0;
} else
{
m_nRevState = STATE_NULL;
m_nRevBytes = 0;
}
break;
} case STATE_REV: // 接受数据
{
m_lstShowMsg.AddString("have received!");
m_nRevBytes = m_ClientSocket.Receive(ucRev, m_unFraLen);
if ((UINT)m_nRevBytes<m_unFraLen)
{
puchSendBuf[0] = 0xFF;
puchSendBuf[1] = 0xF0;
puchSendBuf[2] = 0x00;
puchSendBuf[3] = 0x00;
m_ClientSocket.Send(puchSendBuf, 4);
m_lstShowMsg.AddString("resend!\n");
m_nRevState = STATE_NULL;
m_nRevBytes = 0;
break;
}
ucRev[m_nRevBytes] = NULL; m_nCount++;
CString strShow ;
strShow.Format("%d ", m_nCount);
strShow += ucRev;
m_lstShowMsg.AddString(strShow); m_unFraLen = 0;
m_nRevState = STATE_NULL; puchSendBuf[0] = 0xFF;
puchSendBuf[1] = 0xF1;
puchSendBuf[2] = 0x00;
puchSendBuf[3] = 0x00;
if (m_ClientSocket.Send(puchSendBuf, 4)==4)
{
m_lstShowMsg.AddString("send success!");
m_lstShowMsg.AddString("");
}
m_nRevState = STATE_NULL;
m_nRevBytes = 0; break;
}
}
}