socket异步连续接收数据出错

guott1020 2003-05-18 03:59:18
用异步socket实现数据的接收(tcp/ip协议),要连续接收上千次(用WSARecv).每次接收的数据长度固定为167个字节(服务器端每次也发送167个字节)。前几十次接收的数据是正确的,但后面接收的数据与预期的不一至了。怎么解决呢?
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guott1020 2003-05-18
  • 打赏
  • 举报
回复
to shilong :数据是每次都能够接收到的(我用了基于事件的重叠式I/O模
型)。现在的问题是:按预测的应该接收到867条数据,每一条167个字节,
接收的前几十条都是正确的,几十条后,数据就变成错误的了(是数据与预
期的不一至),数据的第一位应该是1现在却变成了8。服务器端发送的没有
题问,已经在VB下用Winsock控件做过测试。
shilong 2003-05-18
  • 打赏
  • 举报
回复

建立一个接收线程,循环接收,如果没有数据就等待(如WaitForSingleObject(pMainDlg->m_proPubEvent, -1);),直到再次触发OnReceive(SetEvent(pMainDlg->m_proPubEvent));
给你一段代码参考:

线程函数:
UINT ServerTempRcvPro(LPVOID pParam )
{
CProSocket* mySocket = (CProSocket*)pParam;//CProSocket为CAsyncSocket的派生类
CString ipAdress, tmpstr;


UINT port;

extern int i;
char buff[128];
char header[9];
char tmp[8];
char namestr[20];

char cmd[5];
char datenum;

short bufflen;
short sendbufflen;
short namelen;


CTTSPDlg * pMainDlg = (CTTSPDlg *)(AfxGetApp()->m_pMainWnd);
mySocket->GetPeerName(ipAdress, port);

while(1)
{
int ret = mySocket->Receive(header, 8);
header[8]='\0';

if (!ret)
{
AfxEndThread(0, TRUE);
}

if (ret==SOCKET_ERROR)
{
ResetEvent(pMainDlg->m_proPubEvent);
WaitForSingleObject(pMainDlg->m_proPubEvent, -1);
}
else
{
if (!strcmp(header, "SCPCRSSS"))
{
mySocket->Receive(&bufflen, 2);
mySocket->Receive(tmp, 4);//sid
mySocket->Receive(tmp, 4);//eid
mySocket->Receive(cmd, 4);
cmd[4]='\0';

if (!strcmp(cmd, "JREQ"))
{
mySocket->Receive(&datenum, 1); //暂不使用

mySocket->Receive(&namelen, 2);
mySocket->Receive(namestr, namelen);
namestr[namelen]='\0';

// 建立临界区

pMainDlg->m_otherUserName = namestr;

strcpy(buff, "SCPCRSSS");

sendbufflen = 22;

*(short *)(buff+8) = sendbufflen;

//sid,eid.....
strcpy(buff+18, "JREJ");
mySocket->Send(buff, 22);


}

}
}



}


return 0;

}


void CProSocket::OnReceive( int nErrorCode )

{
CTTSPDlg * pMainDlg = (CTTSPDlg *)(AfxGetApp()->m_pMainWnd);
SetEvent(pMainDlg->m_proPubEvent);
CAsyncSocket::OnReceive(nErrorCode);


}
guott1020 2003-05-18
  • 打赏
  • 举报
回复
我在VC中单步调试,每次调用WSARecv接收后用strlen查看接收的数据长度
都是167个字节。
netfyee 2003-05-18
  • 打赏
  • 举报
回复
连续发送,可能造成发送 没成功。

发送端的数据其实可能 合并发送的

在客户端所受到的长度也不是固定的167
guott1020 2003-05-18
  • 打赏
  • 举报
回复
以前也碰到过,用setsockopt将接收缓冲区设大一些解决了此问题。
但现在再用此方法不起作用。
guott1020 2003-05-18
  • 打赏
  • 举报
回复
to microyzy :在VB中用Winsock控件对服务器端程序做过测试没有问题,
现在用vc编写客户端,才出现这个问题。客户端发出的数据逐一做过查看,
没有问题(总共161个字节)。
microyzy 2003-05-18
  • 打赏
  • 举报
回复
??
先确认客户端发出的数据是正确的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧