recvfrom接受的字符串 怎么每次都接受5个字符,后面全是00000000000000000

一纸积墨 2013-03-17 11:10:02
接受部分的源码
char recvBuf[100];
int recv=0;
while(1)
{
memset(recvBuf,'0',100);
int len=sizeof(SOCKADDR);
recv=recvfrom(socket,recvBuf,100,0,(SOCKADDR*)&addrForm,&len);//接收服务器的信息
if (recv == SOCKET_ERROR)
{
AfxMessageBox(_T("接受消息失败."));
//AfxMessageBox(i);
break;
}
检查过sendto,每次发出的字符串都是正确的
而且recvfrom的返回值recv一直是5.
也就是 只接受了5个字符,后面全是00000000
怎么回事?
求救啊 。。。
...全文
289 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sendto的时候,被发送的数据有正确被写到发送缓冲区吗?可能带有‘\0’结束符,让编译器误认为你的发送数据结束了。这个情况,最好采取1楼说的办法来发送。
特雷西_KID 2013-03-18
  • 打赏
  • 举报
回复
一般用socket的话 还是用char*类型的好!
youngwolf 2013-03-18
  • 打赏
  • 举报
回复
只有一种可能,就是你原来的程序里面的100个长度的buffer太短,你后面的代码反而很不标准,正确可能有运气成份(当然我也不知道你具体是怎么给CString分配缓存的,不好说)。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
这句话“其实CString和socket api根本不在一个层次之上”,一语道破。 金玉良言啊,受教了。
youngwolf 2013-03-18
  • 打赏
  • 举报
回复
memset(recvBuf,0,100);并没有错,只是有些多余,如果不设置为0,那后面就是随机值,是你想要的吗? 接收长度以recvfrom返回值为准,而不是以\0在buffer的位置为准。 windows的socket api接口设计的有些问题,它的参数是const char*类型,这让人觉得网络编程就是字符串操作,所以什么CString啊,如何发送二进制啊,等等一系列问题就出现来,还有些人专门把二进制数据(比如float)转为字符串来发送的。 其实参数应该是const void*类型,你想要发送任何数据都行,传一个buffer地址给它即可,linux下面就是const void*类型的。 看楼主最后一贴,我感觉楼主在奇怪,为什么sendto不接收CString,其实CString和socket api根本不在一个层次之上,socket api根本不知道CString是什么东西,CString是MFC/ATL的东西,是微软的东西,socket api是全世界标准的东西(仅接口上)。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
经过大家的帮助,我总算弄明白了这个bug产生的原因,现在总结一下。 之所以每次都只接受5个字符,正如16楼所说。char* p;sizeof(p)=4。就是这样。 而为什么后面全是零,是三楼所说的原因,memset(recvBuf,0,100);不能用'0'。导致后面的全部被字符'0'填充。 。。。。 通过这个bug,我发现sendto()的时候直接传入一个CString对象似乎方便些,没有必要费劲把CString转为Char在传进去。而且,当传入CString对象时,在接受端,recvBuf[]甚至都不需要memset(),也不会有问题。当然我估计是因为我的层次太低,还无法理解msdn要求的好处以及我这么做可能出现的危险。 最后还要谢谢大家耐心的解答,无私的帮助。。。 第一次在,csdn发帖,谢谢大家
  • 打赏
  • 举报
回复
引用 16 楼 mousecarrot 的回复:
引用 9 楼 hq123456789123 的回复:引用 7 楼 CKnightx 的回复:sendto的时候,被发送的数据有正确被写到发送缓冲区吗?可能带有‘\0’结束符,让编译器误认为你的发送数据结束了。这个情况,最好采取1楼说的办法来发送。 7楼的大哥,怎么检查sendto的时候,被发送的数据有正确被写到发送缓冲区吗?我只知道 char* p; sendto(……
sendto(m_socket,p ,sizeof(p)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 你自己不是写了发送长度是sizeof(p) + 1吗? 这不刚刚好是5字节。。。我还没有看到这句话。。多亏楼上说了,多看了一眼。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
引用 16 楼 mousecarrot 的回复:
引用 9 楼 hq123456789123 的回复:引用 7 楼 CKnightx 的回复:sendto的时候,被发送的数据有正确被写到发送缓冲区吗?可能带有‘\0’结束符,让编译器误认为你的发送数据结束了。这个情况,最好采取1楼说的办法来发送。 7楼的大哥,怎么检查sendto的时候,被发送的数据有正确被写到发送缓冲区吗?我只知道 char* p; sendto(……
16楼正解
酒红色的泪 2013-03-18
  • 打赏
  • 举报
回复
引用 9 楼 hq123456789123 的回复:
引用 7 楼 CKnightx 的回复:sendto的时候,被发送的数据有正确被写到发送缓冲区吗?可能带有‘\0’结束符,让编译器误认为你的发送数据结束了。这个情况,最好采取1楼说的办法来发送。 7楼的大哥,怎么检查sendto的时候,被发送的数据有正确被写到发送缓冲区吗?我只知道 char* p; sendto(m_socket,p ,sizeof(p)+1,0,……
就是这的问题,p是指针,sizeof(p)等于4,你只发送了五个字符。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
引用 13 楼 CKnightx 的回复:
先将CString强制转化为char*,再传入了一个char* 上面是你说的。。 如果你是在多字符环境下,CString 中保存的元素,可能是wchar_t类型的。一个字符占2字节,第二个字节,很可能就是'0'。 例如:CString szStr = _T(“abc”);如果直接强制转换成char*,那么char* 后的数据可能是 {'a' '0' 'b'……
对,我是多字节环境,而且也是强制转换为char*,但我接受到了5个字符,不是一个,我当时试验了很多次,每次都是5个,所以。。您的解释还是说不通啊
wenhong609 2013-03-18
  • 打赏
  • 举报
回复
估计是你在发送数据的时候没有在字符串的末尾加上\0。
  • 打赏
  • 举报
回复
先将CString强制转化为char*,再传入了一个char* 上面是你说的。。 如果你是在多字符环境下,CString 中保存的元素,可能是wchar_t类型的。一个字符占2字节,第二个字节,很可能就是'0'。 例如:CString szStr = _T(“abc”);如果直接强制转换成char*,那么char* 后的数据可能是 {'a' '0' 'b' '0' 'c' '0' '0' '0'} 发送的可能就只有一个字符'a',因为遇到第二个字符'0',可能程序认为是到了缓冲区结束的地方了。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
引用 11 楼 CKnightx 的回复:
我说的缓冲区,不是底层通信的数据包缓冲区。我的意思是保存你要发送数据的数组,或者流 p指向的就是你缓存区的首地址嘛,你的p应该是个 char* 的数组吧,这个数组就是你的发送数据缓冲区。
这样的话,那是已经发送到缓冲区了。
  • 打赏
  • 举报
回复
我说的缓冲区,不是底层通信的数据包缓冲区。我的意思是保存你要发送数据的数组,或者流 p指向的就是你缓存区的首地址嘛,你的p应该是个 char* 的数组吧,这个数组就是你的发送数据缓冲区。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
并且不是/0的问题,因为我根本没输0
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
引用 7 楼 CKnightx 的回复:
sendto的时候,被发送的数据有正确被写到发送缓冲区吗?可能带有‘\0’结束符,让编译器误认为你的发送数据结束了。这个情况,最好采取1楼说的办法来发送。
7楼的大哥,怎么检查sendto的时候,被发送的数据有正确被写到发送缓冲区吗?我只知道 char* p; sendto(m_socket,p ,sizeof(p)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 在执行时,p是指向了正确的字符串。
一纸积墨 2013-03-18
  • 打赏
  • 举报
回复
5楼的大哥,我传送的数据肯定比100的buffer短。您后面说的cString的缓存什么的,我不太懂。菜鸟。。 CString temp; GetDlgItemText(IDC_EDIT_SEND,temp); 就是这样得到的CString对象, 我对C++操纵内存这个,还不是很懂
一纸积墨 2013-03-17
  • 打赏
  • 举报
回复
已经解决了,sendto(m_socket,temp,temp.GetLength()+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));中第二个参数直接传入一个CString对象,原本按照是按照msdn说明,先将CString强制转化为char*,再传入了一个char*,结果就出现了如上的bug,直接传入一个CString,就修复了。 不过不知道具体为什么这样 谢谢大家了
Geoff08Zhang 2013-03-17
  • 打赏
  • 举报
回复
这样修改就行了:memset(recvBuf,0,100);不能用'0'。建议参考这的socket源码,不用总自己写: http://download.csdn.net/detail/geoff08zhang/4571358
fishion 2013-03-17
  • 打赏
  • 举报
回复
检查一下sendto发送数据的长度正确否
加载更多回复(1)

18,356

社区成员

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

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