通信的问题,看看

zero1977 2003-10-15 06:44:41
通信协议:
包头 + 包体
=============================================

for(int i = 0; i < 10; i++ )
{
// 发包头
int iret = send(sockfd, &header, sizeof(PKGHEADER), 0);
if( iret > 0 )
{
// 发包体
iret = send(sockfd, pBody, nBodySize, 0);
}
}

如果在发包体的时候失败,那么以后客户端收到的数据就会
错位?
客户端收到一个包头,然后收包体(实际是下一个包的信息)

怎么解决??
...全文
34 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanch 2003-10-16
  • 打赏
  • 举报
回复
主要是设计的问题,首先要从包的严谨性开始,然后接收解析的严谨性。看你对数据完整性的要求高不高了,除了包头外,可以有个包尾,包尾包含该包的MD5校验码等。完成了包的严谨性,那接收解析就按照包的格式进行了。还可以有多次交互等等来保证数据的完整。至于数据的安全又关系到数据加密和数字签名等东东了。不过在要求不高的情况下一头一尾保证就差不多了,中间由TCP协议保证一般不会有错。我建议包头内容什么的一起发送,这样包头中包含的比如关于该包索引等信息才能被接收端得到。另外包头和包尾都不应该太长,TCP传输在底层有一个分包的情况,比如你发送的是10K,底层可能是每次发送和接收1K。总之保证数据的可靠传输不是一件简单的事,TCP是可靠的,它底层也有多次握手,所以根据具体情况制定一个相对可靠的传输就可以了。
lostgdi731 2003-10-15
  • 打赏
  • 举报
回复
哈哈,你们要想得那么美吗?有些事情你们是办不到的,例如我发送1024个字节数据,结果另一边是收到1024个了,但中间的数据会不会有问题?我想你们想那么多还不如想想这个吧。
头你都会大啊。
你们的方法不太对,其实要看具体的情况设计相应的方法。
sevencat 2003-10-15
  • 打赏
  • 举报
回复
对出错代码进行一些检测。有的出错不用关闭只要重发即可而有的需要重连接。
风龙-3 2003-10-15
  • 打赏
  • 举报
回复
最好是在发送包体后,增加错误检测机制,如果发送失败,就CLOSE该连接,然后再重新连接,进行发送
lostgdi731 2003-10-15
  • 打赏
  • 举报
回复
问个问题,如果我不按照这样做(包头+发送buffer)。
而在每对send/receive 里确定发送了和接受到总字节数会有错不?(例如我发送大型文件的时候)。
sevencat 2003-10-15
  • 打赏
  • 举报
回复
失败看为什么失败看看出错代码要不要重发。
一般失败了这个连接好像也结束了。
后面的也接收不了了。

还有种可能就是只发出了一部分这时候将下面的继续发下去。
ffantasyYD 2003-10-15
  • 打赏
  • 举报
回复
一般发包都是把包头和包体放到一个buffer下作为一个整体发出去的,你这样发我不知道会不会出错,但如果你把它们放到一起发,那么你的问题就解决了

18,355

社区成员

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

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