Perl Socket Server using upack

本文介绍了一个使用Perl编写的简单传真服务端程序。该程序监听特定端口,接收传真的二进制数据并将其保存为文件。接着,程序会检查传真状态并采取相应措施,如发送确认消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!usr/bin/perl
#服务端 
use IO::Handle; 
use Socket; 
use checkfax;
use sendFax;

$port=6010; 
$host='28.17.250.11'; 
$packhost=inet_aton($host); 
$address=sockaddr_in($port,$packhost); 
socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp'))|| die "socket create:$!\n"; 



#setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 2) || die "socket reuse: $!\n";
bind(SERVER,$address) || die "socket bind:$!\n"; 
listen(SERVER,2)||die "socket listen:$!\n"; 
my $receive=0;

#binmode(FILENEW);
while(1){
sleep 2;

next unless (accept(CLIENT,SERVER)); 
CLIENT->autoflush(1); 
#判断传真是否可用
my $tom = checkfax->new();
my $result = $tom->checkFax();
warn "result:".$result."\n";
if ($result eq 'active'){
#如果传真忙 就返回字母d
 syswrite(CLIENT,"d\n");

}
else{
#否则删除已存在文件
my $file = "/root/myhen.tif";
if(-e $file){
unlink $file;
}
system(`touch $file`);
open (FILENEW,">$file") or die "can not open myhen.tif";

#读取8个字节
sysread(CLIENT,$front,8);
#利用unpack进行解码
my ($id,$phonelength)=unpack("i2",$front);

sysread(CLIENT,$front1,$phonelength);
my $phone = unpack("A$phonelength",$front1);

sysread(CLIENT,$front2,4);
my $filelength=unpack('i',$front2);


print "id:".$id."phonelength:".$phonelength."phone:".$phone."filelength:".$filelength."\n";
my $count=0;
#每次读取1024循环写入文件
 while ($count<$filelength)
    {
      $read = sysread(CLIENT,$buf,1024);
#把读取的字节写入文件
	syswrite(FILENEW,$buf,1024,0);
	$count+=$read; 	
#	warn $count."\n";
	#last if($read == 0);
}
#warn $count;

close FILENEW;
my $sendfax = sendFax->new($phone,$id);
$sendfax->sendFax();
syswrite(CLIENT,"c\n");
 
print '666';


}
}
close CLIENT;
close SERVER; 
exit 1;
### struct.pack 和 struct.unpack 的使用方法及区别 `struct.pack` 和 `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信和文件格式解析等场景。 #### struct.pack 的使用方法 `struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符和可选的字节顺序、大小和对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 示例代码如下: ```python import struct # 使用大端模式打包两个整数和两个字节 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' ``` #### struct.unpack 的使用方法 `struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包为 Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误或数据不一致。 示例代码如下: ```python import struct # 解包之前打包的数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` #### struct.pack 和 struct.unpack 的区别 `struct.pack` 和 `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序和大小的场景,例如网络协议数据的编码和解码。 此外,`struct.pack` 和 `struct.unpack` 与字符串的 `encode` 和 `decode` 方法不同。后者用于在文本数据和字节流之间进行转换,而前者用于在二进制数据和 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。 #### 格式字符串的规则 格式字符串由格式字符、数量前缀和字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 #### 注意事项 - 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。 - 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。 - `struct.pack` 和 `struct.unpack` 支持的数据类型有限,主要适用于数值类型和固定长度的字符串。 - 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。 --- ### 示例代码 ```python import struct # 打包数据 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' # 解包数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` --- ### 相关问题 1. 如何使用 struct 模块处理 C 语言结构体? 2. 如何在 Python 中使用 struct 模块解析网络协议数据? 3. struct.pack 和 struct.unpack 如何处理浮点数? 4. 如何使用 struct 模块处理变长字符串?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值