Connection Refused Error - zwischen Win und Linux

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Freitag 18. Juli 2008, 15:51

Hallo zusammen,

ich habe folgendes Problem mit einem Script von mir. Kurz zur Info vorab, zwischen zwei Windows PCs klappt die Verbindung ohne Problem...

Ich möchte eine Verbindung zwischen einer WinXP und Linux 2.6 Maschine über TCP/IP (socket-modul) aufbauen. Diese kommt auch korrekt zu Stande, wird aber nach etwa 50 bis 100kB Datenaustausch getrennt (111, "Connection refused"). Wie erwähnt funktioniert die Verbindung und der Datenaustausch zwischen zwei WinXP-Rechnern ohne Probleme...

Gibt es irgendwelche eigenheiten des Socket-Moduls, auf die man achten muss?

An der Linux-Kiste habe ich schon sämtliche Buffer auf das Maximum von 16MB hochgesetzt.

Die Verbindung ist blocked TCP/IP ohne neu definiertem Timeout...

Hat jemand eine Idee? Kann mir jemand nen Tipp geben?

Danke
GALDO

EDIT: Firewall ist natürlich keine aktiviert und die Rechner hängen in einem Lokalen Netzwerk an einem eigenen Switch mit festen IP-Adressen im 192.168er Netz
BlackJack

Freitag 18. Juli 2008, 17:23

Kannst Du vielleicht ein minimales Skrip(paar) mit dem Problem zeigen? Und auch verraten wo die Fehlermeldung mit der 111 kommt, auf Windows oder Linux!?
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Freitag 18. Juli 2008, 18:59

Code: Alles auswählen

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost",4444))

try:
  while (True):
    msg = s.recv(4)
    if (len(msg) < 2):
      print "Nur zwei Byte lang"
    else:
      print "vier Byte"

except socket.error, msg:
  print msg[1]
  s.close()
Auf das Win-Programm hab ich keinen Einfluss - der Server läuft einfach!

Er sendet permanent Daten, und wenn ich vom client (win) -> server (win) verbinde, gehts auch. Nur vom client (linux) -> server (win) kommt die Meldung :(

Danke
Galdo

PS: Mir ist auch aufgefallen, dass im Windows-Client Python 2.5.2 installiert ist, während auf Linux 2.4.4 - aber socket sollte eigentlich zwischen den beiden Versionen keine Änderungen haben!
BlackJack

Freitag 18. Juli 2008, 19:58

"Connection Refused" kann eigentlich nur in der `connect()`-Zeile kommen und nicht in der ``while``-Schleife. Da steht die Verbindung ja schon!? Und der Fehler bedeutet, dass entweder der Server nicht läuft, oder jemand die Verbindung verhindert. Vielleicht auch, dass zu viele Verbindungen vom Server noch nicht angenommen wurden.
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Freitag 18. Juli 2008, 21:16

Wie ich im ersten Post geschrieben habe, kommt die Verbindung aber Zustande und wird nach einiger (kurzer) Zeit erst wieder getrennt - vorher ist mein Client auf jeden Fall schon verbunden!

Auf Grund irgendeiner Tatsache kommt wird die Verbindung getrennt, die entweder vom OS her rührt, oder von der "älteren" Python Version...

Der Server hat nur die eine Verbindung offen.

Weiß jemand einen Unterschied, wie Windows und Linux TCP/IP Verbindungen handlen???

Danke GALDO
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Montag 21. Juli 2008, 09:19

Hat denn keiner ne Idee :(

Ein Update auf 2.5.2 auf der Linux-Büchse hat leider keinen Unterschied gebracht. Mir wäre auch schon geholfen, wenn es wahrscheinlich am Server liegt (wovon ich ausgehe)...

Die MTU sind auf beiden Plattformen 1500
Der (Schreib und Lese) Puffer auf der Linux-Büchse ist global 16MB in der Server-Applikation ebenfalls auf 16MB eingestellt...

Ich hab keine Idee mehr - das ist mir alles zu dubios!

Galdo
BlackJack

Montag 21. Juli 2008, 10:11

Vielleicht mit Wireshark mal nachsehen wer von den beiden die Verbindung trennt. Dann kann man auf der Seite weitersuchen.
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Montag 21. Juli 2008, 11:09

3704 63.894869 10.241.70.36 10.241.70.35 TCP 39095 > ibm-cics [FIN, ACK] Seq=1 Ack=162669 Win=205 Len=0 TSV=3378102 TSER=139682
3706 63.895022 10.241.70.35 10.241.70.36 TCP ibm-cics > 39095 [FIN, ACK] Seq=162669 Ack=2 Win=65501 Len=0 TSV=139682 TSER=3378102
Zuerst sendet der Client ein FIN an der Server, der das mit ACK bestätigt, und dann kommt nochmal einer FIN vom Server zurück, dass vom Client bestätigt wird?

Was kann das für eine Ursache haben, dass das nur unter Linux auftritt? Die Puffer sind wie gesagt auf 16MB eingestellt - kann das irgendwie noch mit der Kernel-Config zusammenhängen?
sysctl -w:
net.core.rmem_max="16777216"
net.core.wmem_max="16777216"
net.ipv4.tcp_wmem="16777216"
net.ipv4.tcp_rmem="16777216"
Danke
Galdo
Antworten