没有明确定义边界的,大数据量的数据包要怎么一次一包的收?

shanyang1 2011-02-17 11:17:47
有一应用,服务器以极快速率发送大容量数据包(每次发送最小32k最大512k数据)
数据包没有明确的头尾识别定义,因此客户端必须一次把服务器发送的包收全
比如服务器发送了一个512k的包,客户端必须一次receive就把512k收掉,不能零散地收了在拼接(因为没有边界定义,根本无法进行拼接)

请问要怎么收取?
编程思路是什么?
...全文
900 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qman007 2011-02-17
  • 打赏
  • 举报
回复
TCP是byte stream的,无消息边界,UDP有消息边界
但不是可靠传输。

TCP实现的逻辑边界方法大致有几种:
一:传输txt
1:分隔符
2:定长
3:不定长,头部标识后续长度
二:传输二进制
1:定长
2:不定长,头部标识后续长度
注意:二进制数据中特别是struct/union类型的一定要
转换字节顺序。
wateryh 2011-02-17
  • 打赏
  • 举报
回复
如果数据包的长度不是固定的,
你怎么判断一包的结束呢,就是怎么知道是32K还是512K呢
jackson35296 2011-02-17
  • 打赏
  • 举报
回复

BOOL AxRecvData( SOCKET s, char* buf, int len )
{
int iRecvTotal = 0;
int iRecvOnce = 0;
while ( iRecvTotal < len )
{
iRecvOnce = ::recv( s, buf + iRecvTotal, len - iRecvTotal, 0 );
if ( iRecvOnce == SOCKET_ERROR || iRecvOnce == 0 )
{
return FALSE;
}
iRecvTotal += iRecvOnce;
}
return TRUE;
}

char *pBuf = new char[512*1024];
AxRecvData(socket, pBuf, 512*1024);
//...
delete []pBuf;
mayudong1 2011-02-17
  • 打赏
  • 举报
回复
有解吗?
fishion 2011-02-17
  • 打赏
  • 举报
回复
很难,至少我也没想到,而且我印象中,用setsockopt,SO_RCVBUF最多也就是设置64K吧
xiaoguailong3 2011-02-17
  • 打赏
  • 举报
回复
这不好弄呀,要是连续发几个包过来不是毁了!!
covsno 2011-02-17
  • 打赏
  • 举报
回复
或者阻塞接收
然后搞个定时器,塞了多少秒就认为接收完了
covsno 2011-02-17
  • 打赏
  • 举报
回复
哪有这么Nc的搞法?
怎么收都收不了,除非收完一次就关闭socket一次然后再连
shenyi0106 2011-02-17
  • 打赏
  • 举报
回复
用同步socket
或者让MS给你修改一套符合你要求的socket接口
yangyang_1980_ren 2011-02-17
  • 打赏
  • 举报
回复
TCP是无边界的,UDP是有边界的
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shanyang1 的回复:]

引用 10 楼 visualeleven 的回复:
TCP是流,是没有边界的,还是自定义协议吧


就是没有定义边界的协议,问了一下服务端开发人员,对方说他们那边发一个512k包,就是一个消息
叫我们这边收到一个完整包后用一个消息出发接受就可以


分段收就怕丢包,比如服务端发12345,有没有可能我就收到1,5中间的234全没了?
还是说收不到234则5也肯定收不到?
[/Quote]

当然收不到234肯定也收不到5了,TCP协议自身保证的
心留 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fishion 的回复:]
很难,至少我也没想到,而且我印象中,用setsockopt,SO_RCVBUF最多也就是设置64K吧
[/Quote]

同意
fishion 2011-02-17
  • 打赏
  • 举报
回复
TCP就是安全可靠的
shanyang1 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualeleven 的回复:]
TCP是流,是没有边界的,还是自定义协议吧
[/Quote]

就是没有定义边界的协议,问了一下服务端开发人员,对方说他们那边发一个512k包,就是一个消息
叫我们这边收到一个完整包后用一个消息出发接受就可以


分段收就怕丢包,比如服务端发12345,有没有可能我就收到1,5中间的234全没了?
还是说收不到234则5也肯定收不到?
Eleven 2011-02-17
  • 打赏
  • 举报
回复
TCP是流,是没有边界的,还是自定义协议吧

18,356

社区成员

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

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