perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 34
Click for quality!




10.02.2012 / 09:10

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Suchanfragen für Scripts/Programmierung zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragTCP/IP Server
Seitenanfang
Hi, ich suche ein simples TCP/IP Chatserver script geschrieben mit perl!

Datum: 03.08.2008-03:57

Beitragre: TCP/IP Server
Seitenanfang
perldoc perlipc

Abschnitt ''TCP-Clients with IO::Socket''

http://perldoc.perl.org/perlipc.html#TCP-Clients-with-IO%3a%3aSocket

Abschnitt ''TCP-Servers with IO::Socket''
http://perldoc.perl.org/perlipc.html#TCP-Servers-with-IO%3a%3aSocket

Ist zwar kein Script fuer einen Chatserver, kann aber eins werden. ;-)

Datum: 03.08.2008-15:35

Beitragre: TCP/IP Server
Seitenanfang
Hallo,

Habe folgenden nun Code:


#!/usr/bin/perl

use IO::Socket;
use DBI;

my $dbname="bblaaa";
my $username="bla";
my $pw="blabla";

my $data1 = "DBI:mysql:$dbname";
my $data2 = DBI->connect($data1, $username, $pw, { RaiseError => 1 }) || die("Kann MYSQL DB nicht öffnen!");

use constant MYPORT => 9810;
$sock = new IO::Socket::INET(LocalPort => MYPORT,
Reuse => 1,
Listen => 5)
or die "can't create local socket: $@\n";

print "Server lauft, zum Beenden Strg+c eingeben oder Prozess killen\n";

while ($client = $sock->accept()) {

print "Accepting connections on Port ", MYPORT, "...\n";
print "Accepted connection from ",
$client->peerhost(), ":", $client->peerport(), "\n";

if (fork() == 0) {

while (<$client>) {

$client_send = $_;

my $leer = " ";

#------------------------------------------------------------------
#Protokoll beginn - ABFRAGEN , BEFEHLE etc.

($i1, $i2, $i3, $i4, $i5, $i6)=split($leer,$client_send);

print "\n<- Empfange Daten:\n(".$client_send.")\n";

# --- Start von Verbindungserlaubnis einholen ---

#Vor dem Verbinden zum Server wird eine Verbindungsfrage gestellt. Ist z.B. ein User gebannt kann so der Zugriff auf das System
#verweigert werden.

if($i1." ".$i2 eq "sadfasdfasdfas3dfaswasf9 connect_request\r\n") {

print "-> Verbindung zum Server erlaubt\n";
print $client "connect_ok";
}

#-Nachrichtsenden
if($i1." ".$i2 eq "sadfasdfasdfas3dfaswasf9 nachrichtsenden\n") {

# $i3 ist in diesemfall die chatnachricht

print $i3;
}

}

Nur leider schickt der Server einfach nur 1 Nachricht an 1 Clienten, wenn jetzt z.B. 2 Clienten verbunden sind sendet er die nachricht nur an den zurück, der sie zu ihm gesendet hat! :(

Er soll diese Nachricht (Abschnitt nachrichtsenden) aber an alle verbunden clienten senden :(

Datum: 03.08.2008-16:08

Beitragre: TCP/IP Server
Seitenanfang
>> Er soll diese Nachricht (Abschnitt nachrichtsenden) aber an alle verbunden clienten senden :(

Das klappt nicht da du nur noch den Socket des einen Clients offen hast.

Du musst die Sockets der Clients die sich zum Server verbinden in ein Array oder ein Hash stecken und die Antwort an alle diese Sockets schicken.

Fuer mich sieht es jetzt so aus wie, dass die Clients jedesmal eine neue Verbindung zum Server aufbauen wenn sie eine Nachricht schicken. Besser ist es wenn sich die Clients einmal mit dem Server verbinden, der Socket offen gehalten wird und die Clients ueber diese eine Verbindung die Nachrichten schicken.
Schickt ein Client eine Nachricht, geht der Server das Array mit den offenen Client-Sockets durch und schickt die Nachricht an jeden Socket einzeln.

Was machst du mit der DBI-Verbindung? Speicherst du die Nachrichten in der MySQL?

Ich empfehle auch die Verwendung des IO::Select Moduls (siehe http://www.perlfect.com/articles/select.shtml).

Und "use strict" und "use modules" sollte in keinen Script fehlen, niemals!

Datum: 03.08.2008-18:17

Beitragre: TCP/IP Server
Seitenanfang
Hallo,

Vielen Dank :)

DBI benutze ich für die Loginabfragen etc. (sind jetzt aus platzgründen nicht dabei gepostet)...

Genauso wie du das geschrieben hast hab ich es vor :)

Kannst du mir helfen dies umzusetzen? oder kennst du ein Tutorial dafür?

Datum: 03.08.2008-18:41

-






-
-