Seite 1 von 1

Socket verbinden funktioniert nicht

Verfasst: Freitag 4. Mai 2018, 18:20
von henridoh
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Freitag 4. Mai 2018, 19:41
von Sirius3
@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?

Re: Socket verbinden funktioniert nicht

Verfasst: Freitag 4. Mai 2018, 20:35
von henridoh
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 08:33
von RIN67630
Kannst Du mal den kompletten Code zeigen?

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 09:11
von sls
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 10:27
von kbr
@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?

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 10:32
von henridoh
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 13:05
von sls
Und was war der Fehler?

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 13:32
von DeaD_EyE
Wie oft ist jetzt nach dem Code und dem Traceback gefragt worden?
Hier braucht sich auch niemand zu schämen, dumme Fehler macht jeder.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 15:39
von RIN67630
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 17:11
von sls
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]

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 18:49
von RIN67630
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...

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 19:45
von sls
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 20:30
von RIN67630
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.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 20:38
von Sirius3
@RIN67630: Du hast ja auch kein `listen´.

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 20:40
von sls
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

Re: Socket verbinden funktioniert nicht

Verfasst: Samstag 5. Mai 2018, 20:45
von RIN67630
Sirius3 hat geschrieben:@RIN67630: Du hast ja auch kein `listen´.
Ah OK,
Kaum macht man es richtig...