Socket verbinden funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
henridoh
User
Beiträge: 12
Registriert: Mittwoch 4. April 2018, 21:35

Bei meinem Ubuntu PC(Python 3.7) funktioniert es nicht mich mit einem Server zu verbinden.
Mein Script:

Code: Alles auswählen

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1", 5555))
und darauf kommt folgende Fehlermeldung in Zeile 3:
TypeError: a bytes-like object is required, not 'tuple'

Wenn ich aber genau diesen Script auf meinem Windows PC mit Python 3.6 ausführe funktioniert es.
Hat jemand einen Tipp wie man dies behben kann?
Edit: Wenn ich beim Server server.bind(("127.0.0.1", 5555)) ausführe funktioniert es.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@henridoh: Python 3.7 gibt es nur als Beta-Version. Warum benutzt Du das? Trotzdem hat sich da am Socket-Interface nichts geändert. Wie sieht der komplette Traceback aus und ist `spcket.socket` auch das Standard Socketobjekt?
henridoh
User
Beiträge: 12
Registriert: Mittwoch 4. April 2018, 21:35

Sirius3 hat geschrieben:@henridoh: Python 3.7 gibt es nur als Beta-Version. Warum benutzt Du das? Trotzdem hat sich da am Socket-Interface nichts geändert. Wie sieht der komplette Traceback aus und ist `spcket.socket` auch das Standard Socketobjekt?
Es ändert sich leider nicht wenn ich Python 3.6, bzw 3.5 benutze.
Der Fehlercode sieht so aus:
Traceback (most recent call last):
File "client.py", line 11, in <module>
s.connect(("127.0.0.1", 3333))
TypeError: a bytes-like object is required, not 'tuple'

habs jetzt auch mit python2 ausprobiert, da kommt auch eine Fehlermeldung.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Kannst Du mal den kompletten Code zeigen?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

henridoh hat geschrieben: Edit: Wenn ich beim Server server.bind(("127.0.0.1", 5555)) ausführe funktioniert es.
Dann würde ich sagen, dass der Fehler nicht in deinem Script auf Client-Seite liegt, sondern Server-seitig. Wie schaut der Source-Code auf Server-seite aus? Die bind()-Methode ist eigentlich genau dafür gedacht eine Kommunikation über den Socket zu verarbeiten / anzunehmen usw.
When we say computer, we mean the electronic computer.
Benutzeravatar
kbr
User
Beiträge: 1507
Registriert: Mittwoch 15. Oktober 2008, 09:27

@henridoh: Die Fehlermeldung liest sich so, als ob Du statt eines INET- einen UNIX-Socket erstellt hättest. Das passt aber mit dem hier gezeigten Code nicht zusammen. Daher die Frage, die schon Sirius3 gestellt hat: was hast Du da für ein Socket-Objekt?
henridoh
User
Beiträge: 12
Registriert: Mittwoch 4. April 2018, 21:35

kbr hat geschrieben:@henridoh: Die Fehlermeldung liest sich so, als ob Du statt eines INET- einen UNIX-Socket erstellt hättest. Das passt aber mit dem hier gezeigten Code nicht zusammen. Daher die Frage, die schon Sirius3 gestellt hat: was hast Du da für ein Socket-Objekt?
Ich habe den Fehler gefunden, trotzdem Danke.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Und was war der Fehler?
When we say computer, we mean the electronic computer.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1232
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Wie oft ist jetzt nach dem Code und dem Traceback gefragt worden?
Hier braucht sich auch niemand zu schämen, dumme Fehler macht jeder.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

kbr hat geschrieben: Die Fehlermeldung liest sich so, als ob Du statt eines INET- einen UNIX-Socket erstellt hättest.
Den Unterschied konnte ich herausfinden, wie bewirkt sich das im Python-code?
Eine Frage noch: wenn ich netstat ausführe werden die TCP-Sockets nach TCP und TCP6 sortiert dargestellt.

Wie öffne ich in Python ein TCP6 Socket, das wie folgt auf Localhost abläuft, richtig?
tcp6 0 0 [::]:3030 [::]:* LISTEN

Danke für die Hilfe.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

RIN67630 hat geschrieben: Den Unterschied konnte ich herausfinden, wie bewirkt sich das im Python-code?
Ich verstehe die Frage nicht richtig. Im Code bewirkt sich das erstmal so, dass o.g. Beispiel nicht zur Fehlermeldung passt. AF_UNIX ist, soweit ich weiß, zur lokalen Kommunikation gedacht, wählt man diesen Parameter aus und übergibt das für AF_INET gewöhnliche HOST + PORT Tupel, kommt der entsprechende Python-Traceback. Möchte man trotzdem einen UNIX-Socket erstellen, kann man die Parameter entsprechend HOST+PORT als String übergeben.
RIN67630 hat geschrieben:Eine Frage noch: wenn ich netstat ausführe werden die TCP-Sockets nach TCP und TCP6 sortiert dargestellt.

Wie öffne ich in Python ein TCP6 Socket, das wie folgt auf Localhost abläuft, richtig?
tcp6 0 0 [::]:3030 [::]:* LISTEN
Ich habe es gerade mal ausprobiert, das scheint so zu funktionieren:

Code: Alles auswählen

import socket

HOST = '::' 
PORT = 3030

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind((HOST, PORT))
:: ist die Local Unicast Adresse, das entspricht den alten privaten IPv4-Bereichen in lokalen, nicht im Internet gerouteten Netzen.

netstat -tulpn spuckt dann das hier aus:

[codebox=bash file=Unbenannt.bsh]tcp6 0 0 :::3030 :::* LISTEN 4242/python[/code]
When we say computer, we mean the electronic computer.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

sls hat geschrieben: Wie öffne ich in Python ein TCP6 Socket, das wie folgt auf Localhost abläuft, richtig?
tcp6 0 0 [::]:3030 [::]:* LISTEN
Ich habe es gerade mal ausprobiert, das scheint so zu funktionieren:

Code: Alles auswählen

import socket

HOST = '::' 
PORT = 3030

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind((HOST, PORT))
:: ist die Local Unicast Adresse, das entspricht den alten privaten IPv4-Bereichen in lokalen, nicht im Internet gerouteten Netzen.

netstat -tulpn spuckt dann das hier aus:

[codebox=bash file=Unbenannt.bsh]tcp6 0 0 :::3030 :::* LISTEN 4242/python[/code][/quote]

Leider will das nicht klappen:

Code: Alles auswählen

import sys
import usb.core
from time import sleep
import socket  #https://wiki.python.org/moin/TcpCommunication

HOST = '::'
PORT = 3030
BUFFER_SIZE = 15
dev = usb.core.find(idVendor=0x16c0, idProduct=0x5dc)

assert dev is not None

print hex(dev.idVendor) + ', ' + hex(dev.idProduct)

while True:
  ret = dev.ctrl_transfer(0xC0, 4, 0, 0, 200) # array('B', [107, 24])

  cB = (ret[0] + ((ret[1] & 3) * 256))  + 300
  dB = cB * 0.1
  AK = cB / 5 + 50 
  print dB
  print cB
  print AK
  s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
  s.bind((HOST, PORT))
  #data = s.recv(BUFFER_SIZE)
  #if data is None:
  #  s.send(AK)
  #else:
  #  s.send(data)
  sleep(0.99) # Time in seconds.
Läuft somit ohne Fehlermeldung mit Python2, nur netstat zeigt kein Socket 3030 an:

Code: Alles auswählen

~ $ netstat -a -p | grep tcp
(Es konnten nicht alle Prozesse identifiziert werden; Informationen über
nicht-eigene Processe werden nicht angezeigt; Root kann sie anzeigen.)
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:1880            0.0.0.0:*               LISTEN      4604/node-red       
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      -                   
tcp        0      0 localhost:46958         localhost:43605         VERBUNDEN   -                   
tcp        0      0 localhost:43605         localhost:46958         VERBUNDEN   709/vncserverui     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      -                   
tcp6       0      0 [::]:5900               [::]:*                  LISTEN  
Mit Python3 meckert es, um die Library USB.core...
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

RIN67630 hat geschrieben: Leider will das nicht klappen:

Code: Alles auswählen

while True:
  ret = dev.ctrl_transfer(0xC0, 4, 0, 0, 200) # array('B', [107, 24])

  cB = (ret[0] + ((ret[1] & 3) * 256))  + 300
  dB = cB * 0.1
  AK = cB / 5 + 50 
  print dB
  print cB
  print AK
  s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
  s.bind((HOST, PORT))
  #data = s.recv(BUFFER_SIZE)
  #if data is None:
  #  s.send(AK)
  #else:
  #  s.send(data)
  sleep(0.99) # Time in seconds.
Das kann nicht funktionieren, da du das socket-Objekt immer wieder neu instantiierst, weil es innerhalb der while-Schleife liegt. Da der Port 3030 bereits belegt ist, wird beim erneuten instantiieren ein Traceback fliegen.
When we say computer, we mean the electronic computer.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

das ist alles seltsam.
Jetzt habe ich folgendes in TestSocket3031.py:

Code: Alles auswählen

import socket
     
HOST = '::'
PORT = 3031
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind((HOST, PORT))
while True:
  x = 1
wenn ich TestSocket3031.py ausführe bekomme ich keine Fehlermeldungen.
wenn ich es nochmal ausführe bekomme ich:

Code: Alles auswählen

~ $ sudo python TestSocket3031.py
Traceback (most recent call last):
  File "TestSocket3031.py", line 7, in <module>
    s.bind((HOST, PORT))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
Aber der Socket wird mir nie angezeigt:

Code: Alles auswählen

~ $ sudo netstat -a -p | grep tcp
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      467/sshd            
tcp        0      0 0.0.0.0:1880            0.0.0.0:*               LISTEN      4604/node-red       
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      444/vncserver-x11-c 
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      467/sshd            
tcp6       0      0 [::]:5900               [::]:*                  LISTEN      444/vncserver-x11-c
Wenn ich ser2net starte (das, was ich emulieren will) wird mir der Port 3031 sehr wohl angezeigt.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@RIN67630: Du hast ja auch kein `listen´.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Das liegt daran, dass der Socket dann noch nicht sauber geschlossen bzw. die Verbindung abgebaut wurde, und durch erneuten Programmstart nicht auf dem selben Socket verbunden werden kann.

was dir fehlt, ist ein ein listen(), womit angebeben wird, dass ein Server Verbindungsanfragen auch akzeptiert.

Code: Alles auswählen

import socket

HOST = '::'
PORT = 3031

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind((HOST, PORT))

s.listen(10)
while True:
    x = 1
When we say computer, we mean the electronic computer.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Sirius3 hat geschrieben:@RIN67630: Du hast ja auch kein `listen´.
Ah OK,
Kaum macht man es richtig...
Antworten