projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Set SO_LINGER = 0 on all client sockets
[spider.git]
/
perl
/
Msg.pm
diff --git
a/perl/Msg.pm
b/perl/Msg.pm
index 94f19e6fbadcc3b0df9d0ca172585ac12bf5ec30..15dc26d4ff29fe85e0b56ec665655babb284c256 100644
(file)
--- a/
perl/Msg.pm
+++ b/
perl/Msg.pm
@@
-11,6
+11,13
@@
package Msg;
use strict;
package Msg;
use strict;
+
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
use IO::Select;
use IO::Socket;
use DXDebug;
use IO::Select;
use IO::Socket;
use DXDebug;
@@
-201,10
+208,6
@@
sub disconnect {
$call ||= 'unallocated';
dbg("Connection $conn->{cnum} $call disconnected") if isdbg('connll');
$call ||= 'unallocated';
dbg("Connection $conn->{cnum} $call disconnected") if isdbg('connll');
- unless ($main::is_win) {
- kill 'TERM', $conn->{pid} if exists $conn->{pid};
- }
-
# get rid of any references
for (keys %$conn) {
if (ref($conn->{$_})) {
# get rid of any references
for (keys %$conn) {
if (ref($conn->{$_})) {
@@
-212,10
+215,16
@@
sub disconnect {
}
}
}
}
- return unless defined($sock);
- set_event_handler ($sock, read => undef, write => undef, error => undef);
- shutdown($sock, 3);
- close($sock);
+ if (defined($sock)) {
+ set_event_handler ($sock, read => undef, write => undef, error => undef);
+ shutdown($sock, 3);
+ close($sock);
+ }
+
+ unless ($main::is_win) {
+ kill 'TERM', $conn->{pid} if exists $conn->{pid};
+ }
+
}
sub send_now {
}
sub send_now {
@@
-337,16
+346,22
@@
sub new_server {
my $self = $pkg->new($login_proc);
$self->{sock} = IO::Socket::INET->new (
my $self = $pkg->new($login_proc);
$self->{sock} = IO::Socket::INET->new (
- LocalAddr =>
$my_host
,
- LocalPort => $my_port,
+ LocalAddr =>
"$my_host:$my_port"
,
+
#
LocalPort => $my_port,
Listen => SOMAXCONN,
Proto => 'tcp',
Listen => SOMAXCONN,
Proto => 'tcp',
- Reuse
=> 1);
+ Reuse => 1);
die "Could not create socket: $! \n" unless $self->{sock};
set_event_handler ($self->{sock}, read => sub { $self->new_client } );
return $self;
}
die "Could not create socket: $! \n" unless $self->{sock};
set_event_handler ($self->{sock}, read => sub { $self->new_client } );
return $self;
}
+sub nolinger
+{
+ my $conn = shift;
+ setsockopt($conn->{sock}, SOL_SOCKET, SO_LINGER, pack("ll", 0, 0)) or confess "setsockopt: $!";
+}
+
sub dequeue
{
my $conn = shift;
sub dequeue
{
my $conn = shift;
@@
-379,11
+394,29
@@
sub _rcv { # Complement to _send
$bytes_read = sysread ($sock, $msg, 1024, 0);
if (defined ($bytes_read)) {
if ($bytes_read > 0) {
$bytes_read = sysread ($sock, $msg, 1024, 0);
if (defined ($bytes_read)) {
if ($bytes_read > 0) {
- $conn->{msg} .= $msg;
if (isdbg('raw')) {
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call read $bytes_read: ", $msg);
}
if (isdbg('raw')) {
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call read $bytes_read: ", $msg);
}
+ if ($conn->{echo}) {
+ my @ch = split //, $msg;
+ my $out;
+ for (@ch) {
+ if (/[\cH\x7f]/) {
+ $out .= "\cH \cH";
+ $conn->{msg} =~ s/.$//;
+ } else {
+ $out .= $_;
+ $conn->{msg} .= $_;
+ }
+ }
+ if (defined $out) {
+ set_event_handler ($sock, write => sub{$conn->_send(0)});
+ push @{$conn->{outqueue}}, $out;
+ }
+ } else {
+ $conn->{msg} .= $msg;
+ }
}
} else {
if (_err_will_block($!)) {
}
} else {
if (_err_will_block($!)) {
@@
-411,6
+444,7
@@
sub new_client {
my $conn = $server_conn->new($server_conn->{rproc});
$conn->{sock} = $sock;
blocking($sock, 0);
my $conn = $server_conn->new($server_conn->{rproc});
$conn->{sock} = $sock;
blocking($sock, 0);
+ $conn->nolinger;
$conn->{blocking} = 0;
my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $sock->peerhost(), $conn->{peerport} = $sock->peerport());
$conn->{sort} = 'Incoming';
$conn->{blocking} = 0;
my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $sock->peerhost(), $conn->{peerport} = $sock->peerport());
$conn->{sort} = 'Incoming';