IO::Socket and LWP::UserAgent

Piers Harding piers at ompa.net
Thu Nov 21 01:38:02 CST 2002


While LWP is a magnificent module - it is slow.

Something that you might consider is writing a specific C extension to
handle your HTTP/HTTPS connections.  There is one that uses Gnomes HTTP
module ( written by Matt Sargent ) HTTP::GHTTP, but I don't think that
this supports SSL.  If all you need to do is GETs then VFS::Gnome ( soon
to be part of VFS ) will do it, or CURL::easy, but if you need to POST 
then that is a problem.

Also, are you using Connection: keep-alive on your HTTP connections?  This
 would help performance.

Cheers.


On Thu, Nov 21, 2002 at 05:16:58PM +1100, tim wrote:
> Hello.
> 
> I'm trying to connect to a service provider using two methods:
> 
> HTTPS:// GET via LWP::UserAgent;
> TCP/IP stream via IO::Socket::SSL;
> 
> In each case I'm sending information to be SMSed to mobile phones.
> 
> My script instantiates an object and then calls the specific ->send()
> method; in each case the object is reused. The HTTPS method is about
> three times faster than the socket method. The socket seems to put one
> message per second, whilst the supplier has suggested that 20 per second
> is achievable.
> 
> Am I missing something intrinsic about IO::Socket::SSL (and IO::Socket
> in general), or shoudl I be talking to the provider to get their system
> tuned? They use Win NT as their server, and that's about all I know :)
> 
> Thanks in advance,
> 
> Tim.
> 
> ----------
> 
> [SCRIPT]
> my $sms = new Monash::SMS_Stunnel($account, $pass);
> my $ssl_mobile_number = '0419xxxxxxxxx';
> my $message = 'TEXT for test purposes';
> my $str;
> map {
>     $response = $sms->send_socket_SSL($ssl_mobile_number, $message);
>     if ($response) {
>         $str = "Message $_ sent from process $$";
>     } else {
>         $str = "Message $_ failed from process $$";
>     }
>     carp $str;
> } (1..200);
> 
> [MODULE]
> 
> sub new
> {
>    use IO::Socket::SSL;
>    my $remote_ssl = IO::Socket::SSL->new(
>                Proto=> 'tcp',
>                PeerAddr => 'xx.xx.xx.xx',
>                PeerPort => 'xxx',
>            )
>              or die "cannot connect to [SSL] server";
> 
>     my ($clazz, $account_name, $passwd) = @_;
> 
>     my $self = {
>         _account_name   => $account_name,
>         _passwd     => $passwd,
>         _remote_ssl => $remote_ssl,
>     };
> 
>     bless $self, $clazz;
>     return $self;
> }
> 
> sub send_socket_SSL($)
> {
>     my ($self,$mobile_number,$message) = @_;
> 
>     # These three should form part of the object invocation:
>     my $sender = 'xxxxxx';
>     my $sender_address = 'xxxxxxxxxxxxxx';
>     my $recipient = 'xxxxxxxxxxxxx';
>     my $remote = $self->{_remote_ssl};
>     # Okay, let's send it!
>     print $remote qq{\r\r}.$self->{_account_name}.qq{\r1\r1\r}.
>         qq{$sender\r}.
>         qq{$sender_address\r}.
>         qq{$recipient\r}.
>         qq{$mobile_number}.
>         qq{\rGSM}.
>         qq{\r0\r0\r0\r}.$self->{_passwd}.qq{\r}.
>         qq{$message};
> 
>     # Send result
>     # Accepted Result code = 0x06 Description = Lodge OK
>     # Rejected Result code = 0x15 Description = Lodge Error
> 
>     my $strbuff = '';
>     $remote->read($strbuff,10,0);
>     # Next line for debug purposes only:
> #   print "\nstrbuff was ($strbuff)\n";
>     if ($strbuff =~ /Lodge OK/) {
>         return 1;
>     } else {
>         return 0;
>     }
> }
> 
> __END__



More information about the Melbourne-pm mailing list