社区
网络编程
帖子详情
socket异步连续接收数据出错
guott1020
2003-05-18 03:59:18
用异步socket实现数据的接收(tcp/ip协议),要连续接收上千次(用WSARecv).每次接收的数据长度固定为167个字节(服务器端每次也发送167个字节)。前几十次接收的数据是正确的,但后面接收的数据与预期的不一至了。怎么解决呢?
...全文
164
7
打赏
收藏
socket异步连续接收数据出错
用异步socket实现数据的接收(tcp/ip协议),要连续接收上千次(用WSARecv).每次接收的数据长度固定为167个字节(服务器端每次也发送167个字节)。前几十次接收的数据是正确的,但后面接收的数据与预期的不一至了。怎么解决呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
??
先确认客户端发出的数据是正确的
【boost网络库从青铜到王者】第六篇:asio网络编程中的
socket
异步
读(接收)写(发送)
【boost网络库从青铜到王者】第六篇:asio网络编程中的
socket
异步
读(接收)写(发送)
c++
Socket
异步
通讯
在网络通讯中,由于网络拥挤或一次发送的数据量过大等原因,经常会...在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者
出错
才能返回。在阻塞期间,被阻的函数不会断调用系统函数GetMessage()来保持消...
c++
socket
异步
编程
在网络通讯中,由于网络拥挤或一次发送的数据量过大等原因,经常... 在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者
出错
才能返回。在阻塞期间,被阻的函数不会断调用系统函数GetMessage()来保持消息循环
Linux下
异步
socket
客户端
Linux环境下,声明以后
socket
客户端,接收来自server端的数据
异步
SOCKET
编程-发送和
接收数据
[转]
异步
SOCKET
编程-发送和
接收数据
[转]
我本想把发送和接收分开作为两部分,但是最后我决定只略微解释一下 FD_READ ,留下更多的时间来说明更复杂的 FD_WRITE , FD_READ 事件非常容易掌握. 当有数据发送过来时, WinSock 会以 FD_READ 事件通知你, 对于每一个...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章