Schrift
[thread]4299[/thread]

Probleme bei TCP Server und Client Kommunikation



<< >> 2 Einträge, 1 Seite
esskar
 2005-07-10 15:13
#37638 #37638
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
use strict;
use warnings;
Gast Gast
 2005-07-10 14:57
#37639 #37639
Hallo,

ich habe folgendes Problem: ich arbeite an einem Client Server Programm auf TCP-Basis.Client und Server liegen in separaten Datein.Ich starte den Server und verbinde mich mit dem Client, ein Protokoll wird zwischen den beiden abgearbeitet und der Client wird disconnected.Wenn ich anschließend mich wieder mit einem Client beliebiger IP Adresse zum Server verbinden will, hängt sich der Client auf und landet wahrscheinlich in einer Endlosschleife.

Wo liegt hier das Problem und wie kann man es lösen?

SERVER:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl

use IO::Socket;
use Thread;

# Wichtige Variablen festsetzen
my $HOST = shift || "localhost";
my $PORT = "30381";
my $LOG  = "server_logfile.txt";
my $VERSION = "0.1";

my $server = &Create_Server_Socket();
print "Easyspider Server Version $VERSION bind to $PORT successful: Socket created!\n";

while ($client = $server->accept()) {
    $client_ip = getpeername($client);
    ($port, $ipaddr) = unpack_sockaddr_in($client_ip);
    $client_ip = inet_ntoa($ipaddr);
    \&logmsg($LOG,"[$client_ip] Connection attempt!");

    if (my $pid = fork) {
       close $client or die "Client socket close failed: $!";
   } elsif (defined $pid) {
        #$client->autoflush(1);
        &handle_connection($client,$client_ip);
   } else {
       die "fork error: $!";
   }

}

##### Wichtige Soubroutinen

sub handle_connection(){
    my $client        = @_[0];
    my $client_ip    = @_[1];

    # handle handshake procedure here
    $msg =  <$client>;
    if( $msg =~ /c_type=syn\(1\)/ ){
        print "[" . localtime() . "] [$client_ip] Connection Setup Procedure SYN Paket recieved!\n";
        &send_ack();
        
    }
    close $client;
}

sub send_ack(){
    print $client "c_type=ack(1)\015\12";
    return 1;
}


sub Create_Server_Socket(){
    my $socket = new IO::Socket::INET(
        LocalHost => $HOST,
        LocalPort => $PORT,
        Proto => 'tcp',
        Listen => 2,
        Reuse => 1,
        Type => SOCK_STREAM,
       ) or die "Could not create Socket: $!\n" unless defined($socket);
    \&logmsg($LOG,"Easyspider Server Version $VERSION bind to $PORT successful: Socket created!");
    print "Easyspider Server Version $VERSION bind to $PORT successful: Socket created!";
    return($socket);
}# sub Create_Server_Socket(){}


##### Zusätzliche Soubroutinen


CLIENT:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/perl

use IO::Socket;

# Wichtige Variablen festsetzen
my $HOST = shift || "localhost";
my $PORT = "30381";
my $TIMEOUT = "333";

my $socket = new IO::Socket::INET(
PeerAddr => $HOST,
PeerPort => $PORT,
Proto    => 'tcp',
# Timeout => $TIMEOUT,
) or die "can't connect to $HOST\n";
# Signalhandler setzen
$SIG{'CHLD'} = sub { wait(); };    # Zombies verhindern
$SIG{'TERM'} = $SIG{'INT'} = sub { close($socket) };

&handle_connection();

##########################################################



sub handle_connection(){

#handle handshake procedure
&send_syn;
$msg = <$socket>;

if( $msg =~ /c_type=ack\(1\)/ ){
print "[" . localtime() . "] [$HOST] Connection Setup Procedure ACK Paket recieved!\n";
print "now go one";
close($socket);

}

} #sub handle_connection(){}




#####################################################################################

sub send_syn(){
print $socket "c_type=syn(1)\015\12";
return 1;
}


edit pq: code-tags repariert\n\n

<!--EDIT|pq|1120993885-->
<< >> 2 Einträge, 1 Seite



View all threads created 2005-07-10 15:13.