免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3003 | 回复: 4
打印 上一主题 下一主题

求助:udp接收到的数据字节数,以及16进制输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-09 16:28 |只看该作者 |倒序浏览
本帖最后由 sithui 于 2013-01-09 16:40 编辑

抄了一个测试程序,收发数据用。
发现直接输入的可读字符可以显示,调试协议时的数据并不是可见字符的,显示为空。
同时我也不知道怎么从recv函数中得到收到的数据量。
我查了IO::Socket::INET,发现perldoc和CPAN里都没有对recv函数的详细讲解。
perl平时当工具用一用,实在是不熟。还请大神们帮帮忙!
代码如下:
  1. use IO::Socket;
  2. my $sock = new IO::Socket::INET (
  3.     PeerAddr => '192.168.1.170',
  4.     PeerPort => '20000',
  5.     Proto => 'udp',
  6. );
  7. die "Could not create socket: $!\n" unless $sock;
  8. print $sock "Hello there!\n";

  9. while (1){
  10.         print "\nPlease input:";
  11.         my $msg_out=<STDIN>;
  12.         if ($msg_out eq "\n"){next;}

  13.         if ($msg_out=~/quit/i)
  14.         {
  15.             print$sock "I will quit,bye!";
  16.             close($sock);
  17.             exit 0;
  18.         }
  19.         print $sock $msg_out;
  20.         my $msg_in;
  21.         my $rlen=1024;
  22.         my $peer = $sock->recv($msg_in, $rlen, 0);
  23.         print "Server result[$rlen]:$msg_in\n";
  24.         print_hex($msg_in);
  25.     }
  26. close($sock);
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-01-09 16:29 |只看该作者
我想知道的是,怎么从recv中得知我一次收到了多少个字节。
然后是,我想把msg_in打印成16进制的,方便察看。
谢谢!!!

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
3 [报告]
发表于 2013-01-09 16:36 |只看该作者
length ($msg_in)
非可见字符需要pack/unpack

论坛徽章:
0
4 [报告]
发表于 2013-01-09 16:36 |只看该作者
print_hex 定义在这里:
  1. sub print_hex {
  2.     my ($str) = @_;
  3.     my @arr = split //, $str;
  4.     for my $c (@arr) {
  5.         printf "<%x>", ord($c);
  6.     }
  7.     printf "\n";
  8. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-01-09 16:38 |只看该作者
本帖最后由 sithui 于 2013-01-09 16:39 编辑

回复 3# laputa73

谢谢!我也找到这了,
  1. $rlen = bytes::length($msg_in);
复制代码
这样可以得到长度了。
可能我协议还是有问题,对方回应过来,我这里接收显示$rlen为0,不知道有没有类似linux下的errno可以看的。正常的话,没有收到数据应该会阻塞在recv上的吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP