Myron DaChump has asked for the wisdom of the Perl Monks concerning the following question:
My counter-strike server is transmitting a udp stream to another host (call this the splitter program) which subsquently splits the stream and forwards it to two different ports where to "receivers" catch the ultimate stream.
Simply put host 10.0.0.1 is transmitting a udp stream to 10.0.0.2 at port 10000. 10.0.0.2 then splits it (not the issue) and forwards it to 10.0.0.2:10001 and 10.0.0.2:10002.
So I wrote the following to for the "splitter", which receives the server's stream just fine, it is the forwarding problem that is the trouble. The splitter has no problems forwarding the data (I believe it forwards it to the right port, I think the problem is in the final destination script, see even further below for that code) and I include the relevant portion of the "splitter" here:
my $socket = IO::Socket::INET->new( LocalPort => $LISTEN_PORT, Type => SOCK_DGRAM, Proto => 'udp') || die "ERROR: can't open socket\n"; while ($socket->recv(my $in, 1024) ) { my $sock = IO::Socket::INET->new( Proto => 'udp', PeerAddr =>'127.0.0.1:50000'); print $sock $in;
I believe this to be true and correct. If it is not, please explain why.
The "reciever" performs the following and perhaps this is not a problem with the socket at all:
$s_socket = IO::Socket::INET->new( Proto=>"udp", LocalAddr=>"$s_ip", LocalPort=>"$s_port" ) or die ("\nCan't setup UDP socket on $ip$s_port: $!\n"); print "opened OK\n";
Then it checks to see what port AND ip the data stream is originating from...
$s_socket->recv($s_output, 1024); $s_peerhost = $s_socket->peerhost; $s_peerport = $s_socket->peerport; $s_addr = "$s_peerhost:$s_peerport";
and then later....
# Get the server info, if we know the server, otherwise ignore + the data if (!$g_servers{$s_addr}) { $g_servers{$s_addr} = &getServer($s_peerhost, $s_peerport); if (!$g_servers{$s_addr}) { &printEvent(997, "UNRECOGNISED SERVER: " . $s_output); next; } }
Now this may a be a bit confusing out of context, so I should mention that the script takes the the listen port and IP from the command line and determines if the server is a valid "source" from a mysql database. I would point out that without my "splitter" in the way, this code fragment above works fine when you specify the cs server's IP and port instead of the splitters IP and port.
The error output looks something like this....
Fri Mar 30 19:32:35 2001: 127.0.0.1:44018 - E997: UNRECOGNISED S +ERVER: ˙˙˙˙log L 03/30/2001 - 19:35:10: "eatitPUNK<269><346699><TERRO +RIST>" killed "livestock<370><23593><CT>" with "mp5navy"
So to be even more specific the counter-strike server sent the udp stream to 10.0.0.2:12345 and the splitter forwarded it to localhost via 127.0.0.1:12346. The final receipient does indeed see the stream, it just throws the above error though saying the packet orginates from an unspecified host. If I set the value for the port shown in the error in the database it reads the stream and does what it is supposed to do for a while, but then spontaneously or perhaps not the port is incremented, how I dunno.
So I am sorry for blathering on indefinitely. You time and patience are appreciated. Many thanks.
Myron DaChump chump@regulatorsonline.com
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
(tye)Re: IO:Socket::NET problem & Counter-Strike
by tye (Sage) on Mar 31, 2001 at 09:40 UTC | |
by Myron DaChump (Initiate) on Mar 31, 2001 at 09:57 UTC | |
by tye (Sage) on Mar 31, 2001 at 10:03 UTC | |
by Myron DaChump (Initiate) on Mar 31, 2001 at 10:10 UTC | |
by tye (Sage) on Mar 31, 2001 at 10:13 UTC | |
by Myron DaChump (Initiate) on Mar 31, 2001 at 10:24 UTC |