SOCKET通信,接收到的数据中有0,怎么办?

hanhanwang 2011-04-28 10:34:21
如题。我写的一个简单的TCP服务器程序,接收数据。因为客户端不是我自己写的,因此接收到的数据中有时有很多0,我用recv(fd,buff,2048, 0)接收数据时,能读到的数据只有第一个0前面的部分,后面的就没有了。怎么办?
...全文
763 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanhanwang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hairetz 的回复:]

while(1)
{
ReqLen = recv(fd,buff,2048, 0);
if ( ReqLen > 0 )
{

printf("%s\n",buff);

}
}


buff里数据全了,是你自己用%s打印,导致打印不出来而已

for(int i=0;i<ReqLen;++i)
{
printf("%c\n",buff[i])……
[/Quote]


之前我这样想过啊,问题是recv总是返回2048,而不是接收到的数据的实际大小。。。
  • 打赏
  • 举报
回复
while(1)
{
ReqLen = recv(fd,buff,2048, 0);
if ( ReqLen > 0 )
{

printf("%s\n",buff);

}
}


buff里数据全了,是你自己用%s打印,导致打印不出来而已

for(int i=0;i<ReqLen;++i)
{
printf("%c\n",buff[i]);

}
虫鸣 2011-04-28
  • 打赏
  • 举报
回复
用长度循环,挨个打印char字符,我也菜鸟……
就想叫yoko 2011-04-28
  • 打赏
  • 举报
回复
为什么非得打印呢
收到的数据对就行了
hanhanwang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 h100037 的回复:]

还有个 长度 啊。
[/Quote]
什么长度?
h100037 2011-04-28
  • 打赏
  • 举报
回复
还有个 长度 啊。
乖乖的上帝 2011-04-28
  • 打赏
  • 举报
回复
刚学socket,表示关注此楼。
hanhanwang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

收到的数据包含0是很正常的,关键是你显示时,可能遇到0被截断了
[/Quote]

是这样,我的问题是:怎样显示才能不被截断?
hanhanwang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 falcomavin 的回复:]

接受的数据一定不止于0,最大可能接受的长度应该是2048,除非你的buff不够装。
可能是你打印出来的时候用0判断结束,所以以为只收到了0之前的。
[/Quote]
就是这个意思。我的问题是怎么把0后面的也显示出来?我把关键的代码贴出来下:
char *buff= new char[2048];

while(1)
{
ReqLen = recv(fd,buff,2048, 0);
if ( ReqLen > 0 )
{

printf("%s\n",buff);

}
}
bdmh 2011-04-28
  • 打赏
  • 举报
回复
收到的数据包含0是很正常的,关键是你显示时,可能遇到0被截断了
黑娃 2011-04-28
  • 打赏
  • 举报
回复
接受的数据一定不止于0,最大可能接受的长度应该是2048,除非你的buff不够装。
可能是你打印出来的时候用0判断结束,所以以为只收到了0之前的。
hanhanwang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wish_cn 的回复:]

引用 11 楼 hanhanwang 的回复:
引用 10 楼 hairetz 的回复:

while(1)
{
ReqLen = recv(fd,buff,2048, 0);
if ( ReqLen > 0 )
{

printf("%s\n",buff);

}
}


buff里数据全了,是你自己用%s打印,导致打印不出来而已

for(int i=0;i……
[/Quote]
我理解错了,是不是这样的:accept之后,数据就源源不断的传到服务器的缓冲区(我这端)来了,recv只是从缓冲区将数据读取出来。我之前以为recv一次就相当于接收一个TCP包。一个TCP包的数据大小不到2048,我就一直认为recv返回的有问题。
wish_cn 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hanhanwang 的回复:]
引用 10 楼 hairetz 的回复:

while(1)
{
ReqLen = recv(fd,buff,2048, 0);
if ( ReqLen > 0 )
{

printf("%s\n",buff);

}
}


buff里数据全了,是你自己用%s打印,导致打印不出来而已

for(int i=0;i<ReqLen;++i)
{
……
[/Quote]

你给的buff长度只有2048,返回当然不会超过2048。
多调几次recv吧
想偷懒的话就开个你认为足够大的buff。不过受对方发送方式及网速限制,buff再大也未必能保证一次收完。
赵4老师 2011-04-28
  • 打赏
  • 举报
回复
仅供参考
void HexDump(int cn,char *buf,int len) {
int i,j,k;
char binstr[MAX_STR_LEN_2];

for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%03d %04x -",cn,i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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