Chat - Server und Client zugleich - Hilfe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
JumpLink
User
Beiträge: 9
Registriert: Montag 17. März 2008, 13:57

Chat - Server und Client zugleich - Hilfe

Beitragvon JumpLink » Montag 17. März 2008, 14:22

Hallo liebe Freunde, ich bin froh ein solch schönes Forum wie dieses gefunden zu haben, ich habe nämlich ein kleines Problem.

Grund
Ich wollte einfach ein kleines Chat-Programm programmieren. Es ist nur ein Experiment und soll deshalb nicht weiter ausgebaut werden oder gar perfekt funktionieren, es soll nur zeigen wie ein Chat ohne Server funktionieren könnte.

Funktionsweise
Wie man sehen kann gibt es zwei parallele Threads, einmal den Sender und einmal den Empfänger, der Sender soll die geschriebenen Nachrichten versenden und der Empfänger soll immer ausschau nach Nachrichten halten. Der Einfachheit halber habe ich das ganze nur mit dem Protokoll UDP realisiert. beim starten des Programmes wird nach zwei IP-Adressen gefragt, dort werden die IP-Adressen der Emfänger eingetragen - in diesem Fall zwei -, wenn ich dort beispielsweise 127.0.0.1 eingebe, dann erhalte ich die Nachrichten selbst, dass ganze läuft über den Port 50000. Wenn nun drei PCs miteinander vernetzt werden, dann sollten die sich eigentlich gegenseitig Nachrichten schreiben können. Die geschriebene Nachricht wird dann an beide eingetragenen Adressen geschickt, so sollten 3 personen miteinander chatten können.

Problem
Nun habe ich das ganze unter Linux (Ubuntu 7.10) ausprobiert, zuerst habe ich meinen Desktop-PC und meinen Laptop an meinen Router geschlossen, beim Router die IP 50000 freigeschaltet und wollte das Programm testen, leider funktioniert es nicht, die Nachrichten kommen nicht an. Dann habe ich zwei PC mit einer Crossoverleiten miteinander verbunden um zu sehen ob es am Router lag, beide haben eine Statische IP bekommen aber auch hier kommen die Nachrichten nicht an.

Ich kann mir nur selbst Nachrichten schreiben, entweder gebe ich meine eigene IP an oder localhost, außerdem habe ich das ganze erst mit zwei PCs getestet, zu drei bin ich noch nicht gekommen da ja noch nicht einmal dies funktioniert hat.

Quellcode

Code: Alles auswählen

#!/usr/bin/env python
import socket, thread
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = [0, 0]

def sender():
   while True:
      nachricht = raw_input()
      for i in range(2):
         s.sendto(nachricht, (ip[i], 50000))
def empfaenger():
    s.bind(("", 50000))
    while True:
        daten, addr = s.recvfrom(1024)
        print "[%s] %s" % (addr[0], daten)
for i in range(2):
    ip[i] = raw_input("%i. IP-Adresse: " % i)
   

try:
   thread.start_new_thread(empfaenger, ())
   thread.start_new_thread(sender, ())
   while True:
      pass
finally:
    s.close()


Hat jemand eine Idee? Liegt es vielleicht daran dass das Betriebssystem die Ports nicht frei gibt?

LG JumpLink
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 17. März 2008, 14:49

Was sagt denn ``netstat -lun``?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 18. März 2008, 11:24

Vermutlich willst du Multicast verwenden?
JumpLink
User
Beiträge: 9
Registriert: Montag 17. März 2008, 13:57

Beitragvon JumpLink » Dienstag 18. März 2008, 23:10

Ja stimmt so in der Art, wäre nicht schlecht wenn du mir die Funktion dafür nennen kannst wenn es eine solche gibt. Ansonsten würde ich trotzdem gerne dieses Programm vernünftig zum laufen bekommen.

"netstat -lun" konnte ich nicht nicht testen, bisher nur an einem PC indem ich mir selbst Nachrichten geschrieben habe, dort wurde der Port 50000 angezeigt jedoch sonst nichts.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 19. März 2008, 00:25

JumpLink hat geschrieben:Ja stimmt so in der Art, wäre nicht schlecht wenn du mir die Funktion dafür nennen kannst wenn es eine solche gibt.


Das ist kein Python-Feature, sondern ein IP-Feature: Multicast.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 19. März 2008, 09:43

JumpLink hat geschrieben:"netstat -lun" konnte ich nicht nicht testen, bisher nur an einem PC indem ich mir selbst Nachrichten geschrieben habe, dort wurde der Port 50000 angezeigt jedoch sonst nichts.

Das bringt mir nichts, das Port 50000 offen ist ist ja klar. Du musst schon sagen an welche IP das gebunden ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Mittwoch 19. März 2008, 11:45

Ich habe so ein Tool vor Urzeiten mal in Java angefangen, das bringt dich vielleicht auf die richtige Spur: Mucacha. Sourcecode ist im .jar-File enthalten.
JumpLink
User
Beiträge: 9
Registriert: Montag 17. März 2008, 13:57

Beitragvon JumpLink » Mittwoch 19. März 2008, 12:29

Leonidas hat geschrieben:
JumpLink hat geschrieben:"netstat -lun" konnte ich nicht nicht testen, bisher nur an einem PC indem ich mir selbst Nachrichten geschrieben habe, dort wurde der Port 50000 angezeigt jedoch sonst nichts.

Das bringt mir nichts, das Port 50000 offen ist ist ja klar. Du musst schon sagen an welche IP das gebunden ist.

Damit das dort sonst nichts steht meinte ich dass:
[code=]
Proto Recv-Q Send-Q Local Address Foreign Address State
[...]
udp 0 0 0.0.0.0:50000 0.0.0.0:*
[/code]
soll ich das ganze noch einmal testen indem ich zwei Notebooks direkt mit einer Lanleitung miteinander verbinde?

Danke für das Javaprogramm
JumpLink
User
Beiträge: 9
Registriert: Montag 17. März 2008, 13:57

Beitragvon JumpLink » Dienstag 8. April 2008, 07:00

Danke an alle für die Antworten, ich habe es noch einmal probiert und musste feststellen, dass ich den Port für TCP statt für UDP freigegeben hatte. Das Programm funktioniert also so wie es ist.
Liebe Grüße, JumpLink

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]