问一个SOCKET读数据时碰到的非常简单的奇怪问题

captain_blueeyes_ren 2009-06-05 02:51:57
编了一个socket通讯程序,是以结构体方式解析数据包的,解析完以后又通过udp方式转发回去,过去运行都没有问题
但是不知道改了什么地方,接的数据没有问题,但是在用sendto发送的时候,使用strlen取缓冲区长度总是不对,缓冲区的定义的是一个char*数组,接收到得结构体拷贝到缓冲区,内容也没有错,但取长度的时候总是只取到第三个字节就不取了,结果每次就只发送了3个字节数据,后来看了看结构体数据内容,发现第三个字节为0,可是为0也不应该影响我取字节的长度啊,strlen应该遇到\0才停止的啊?也许我理解的不对,请大家都进来给给意见
...全文
73 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bragi523 2009-06-09
  • 打赏
  • 举报
回复
你收到的是2进制字节流哈
2进制的0就是\0哈
自由之眼 2009-06-09
  • 打赏
  • 举报
回复
你的数据是否加密或者使用了其他的方法?
一个char*数组,如果只是判定数组字符长度,strlen是以'\0'为结束标示符的。对于TCP,它可以把一块内存块发送出去的需求的话,必须在发送的时候,规定发送的长度。
比较常规的做法是,在数据包发送的最前面,包含一个整包的长度,这样recv的时候可以判断包是否完整接受。同理,Send的时候也是这样,追加一个包的长度,把这个长度作为一个包对象的参数。当你要转发的时候,按照包的长度,将数据转发出去,这样就可以避免一些因为数据中的一些特殊字符导致发送不完整的情况。
coldant 2009-06-09
  • 打赏
  • 举报
回复
strLen遇到0就结束了,你发送前先确定此数据的长度不要用strlen
bnm77 2009-06-08
  • 打赏
  • 举报
回复
我遇到过这种情况,如果你那个数据是定长的,干脆把长度定死,strLen会出问题
DreamFreeLancer 2009-06-08
  • 打赏
  • 举报
回复
'\0'不是貌似,而是肯定是0!
hhwei1985 2009-06-05
  • 打赏
  • 举报
回复
学习
hoisf 2009-06-05
  • 打赏
  • 举报
回复
貌似 '\0'就是0啊
就像‘\r’是0xd,'\n'是0xa一样
msdn2009_2010 2009-06-05
  • 打赏
  • 举报
回复
帮顶。
Ryanwen 2009-06-05
  • 打赏
  • 举报
回复
你接收到多少recv不是有返回吗? 直接用这个长度发就是了
Ryanwen 2009-06-05
  • 打赏
  • 举报
回复
strlen 以"\0"作为结束符,你说有没有问题?

18,363

社区成员

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

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