perl socket编程。绑定本地地址以及绑定本地网卡。

本文记录了在Perl中进行socket编程时如何绑定本地地址和本地网卡,涉及socket模块和io:socket:inet模块的使用。特别指出绑定IP与绑定网卡的不同效果,以及绑定网卡需要root权限的问题。对于无法获得root权限的情况,提出了使用expect+sudo的变通方法,但这种方式较为复杂,通常建议直接以root权限运行。

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

最近在弄多网卡测试。本来以为很简单。不过还是费了一些力气找文档。集中记录一下。

1使用socket模块,绑定本地地址

#!/usr/bin/perl -w
# tcp_socket_cli.pl
use strict;
use Socket;
my $addr = $ARGV[0] || '220.181.x.x';
my $port = $ARGV[1] || '80';
my $dest = sockaddr_in($port, inet_aton($addr));
my $localaddr_port = sockaddr_in(0,inet_aton('192.168.1.8'));
 
my $buf = undef;
socket(SOCK,PF_INET,SOCK_STREAM,6) or die "Can't create socket: $!";
bind(SOCK,$localaddr_port) or die "Can't bind socket: $!";  
connect(SOCK,$dest)                or die "Can't connect: $!";

 close SOCK;


2.使用io:socket:inet模块,绑定本地地址

#!/bin/env perl
use strict ;
use IO::Socket qw(:DEFAULT :crlf);
use Time::HiRes qw(time);
use Time::Local;
  
my  $sock = IO::Socket::INET->new(PeerAddr => '220.181.x.x',
     PeerPort => 'http(80)',
     LocalAddr  => '192.168.1.8',
     Timeout  => 2,
     Proto	=> 'tcp');

    		if($sock)
    		{
    			my $tcpSec2=time;    	
    			Debug("TCP delay is $time\n",0);
    		}
    		else {
    			Debug("Socket test failed: $!\n",0);
    		}

3.使用socket模块,绑定interface

#!/usr/bin/perl -w
# tcp_socket_cli.pl
use strict;
use Socket;
my $addr = $ARGV[0] || '220.181.x.x';
my $port = $ARGV[1] || '80';
my $dest = sockaddr_in($port, inet_aton($addr));
my $localaddr_port = sockaddr_in(0,inet_aton('192.168.1.8'));
 
my $buf = undef;
socket(SOCK,PF_INET,SOCK_STREAM,6) or die "Can't create socket: $!";
# SO_BINDTODEVICE = 25, bind to device eth8 
setsockopt(SOCK, SOL_SOCKET, 25, pack("Z*","eth2")); 

#bind(SOCK,$localaddr_port) or die "Can't bind socket: $!";  
connect(SOCK,$dest)                or die "Can't connect: $!";

 close SOCK;

4.使用io:socket:inet模块,绑定interface

#!/bin/env perl
use strict ;
#use socket qw(:DEFAULT :crlf);
use IO::Socket qw(:DEFAULT :crlf);
use Time::HiRes qw(time);
use Time::Local;
    
 
my  $sock = IO::Socket::INET->new(
                              Timeout  => 2,
                             Proto  => 'tcp');
                         
         $sock-> sockopt( 25, pack("Z*","eth2")) ;
          
          my $tcpSec1=time;
          my $dest = sockaddr_in(80, inet_aton('220.181.x.x'));
         my $result=$sock->connect($dest);


 最后注意一点

绑定ip和绑定网卡的效果是不同的(感觉server一般需要绑定ip,client一般需要绑定网卡?)

绑定网卡需要root权限

目前还没有好办法让perl可以获得root权限。(suid似乎是不行的,记得是linux的安全限制)

变通的办法是expect+sudo.不过太麻烦,不如直接用root跑了。

本方式只适用linux,sun和hp不行。其他未试过。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值