社区
网络编程
帖子详情
socket异步连续接收数据出错
guott1020
2003-05-18 03:59:18
用异步socket实现数据的接收(tcp/ip协议),要连续接收上千次(用WSARecv).每次接收的数据长度固定为167个字节(服务器端每次也发送167个字节)。前几十次接收的数据是正确的,但后面接收的数据与预期的不一至了。怎么解决呢?
...全文
168
7
打赏
收藏
socket异步连续接收数据出错
用异步socket实现数据的接收(tcp/ip协议),要连续接收上千次(用WSARecv).每次接收的数据长度固定为167个字节(服务器端每次也发送167个字节)。前几十次接收的数据是正确的,但后面接收的数据与预期的不一至了。怎么解决呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
??
先确认客户端发出的数据是正确的
【精品】:c语言
socket
实现主机与客户端
异步
通信.doc
send()发送指定长度的数据到
socket
,recv()从
socket
接收数据
。在
异步
通信中,这些操作可能不会立即完成,而是根据网络状况和缓冲区大小分多次进行。 8. **
异步
通信**: 在这个示例中,虽然代码没有显示
异步
处理的...
C#原生
Socket
控件版
2.
接收数据
:通过
异步
方法监听指定端口,当接收到数据报时触发事件。 3. 数据处理:接收到的数据可能需要额外处理,例如检查源地址、解析数据等。 “
Socket
Helper”这个文件很可能是封装这些功能的类库或者源码。...
C#
Socket
编程Server和Client
Socket
是操作系统提供的一种接口,它允许应用程序与网络协议(如TCP/IP)进行交互,实现数据的发送和接收。在C#中,我们主要使用System.Net.
Socket
s命名空间中的
Socket
类来操作
Socket
。 标题中的"C#
Socket
编程...
Qt
Socket
编程微信样例
由于
Socket
通信是
异步
的,所以通常会设置信号和槽(Signals & Slots)来监听连接状态改变和数据接收事件。 3. **错误处理**:Qt的
Socket
类提供了丰富的错误处理机制,例如,当连接失败或数据传输
出错
时,可以通过...
简单Async
Socket
的客户端 服务器断开时自动提示
出错
4. **数据传输**:Async
Socket
支持读写操作的
异步
处理,允许客户端发送和
接收数据
而无需等待操作完成。这对于实时通信和大数据传输特别有用。 5. **回调函数**:为了实现自动提示错误,客户端通常会注册一些回调...
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章