Zum Inhalt wechseln

Willkommen Gast

Navigation

Links

   

Als Gast hast du nur eingeschränkten Zugriff!


Anmelden 

Benutzerkonto erstellen
Du bist nicht angemeldet und hast somit nur einen sehr eingeschränkten Zugriff auf die Features unserer Community.
Um vollen Zugriff zu erlangen musst du dir einen Account erstellen. Der Vorgang sollte nicht länger als 1 Minute dauern.
  • Antworte auf Themen oder erstelle deine eigenen.
  • Schalte dir alle Downloads mit Highspeed & ohne Wartezeit frei.
  • Erhalte Zugriff auf alle Bereiche und entdecke interessante Inhalte.
  • Tausche dich mich anderen Usern in der Shoutbox oder via PN aus.
 

Foto

[gelöst] Datenempfang

- - - - -

  • Bitte melde dich an um zu Antworten
5 Antworten in diesem Thema

#1
SAR

SAR

    Regelmäßiger Übertreiber

  • Premium Member
  • Likes
    317
  • 394 Beiträge
  • 271 Bedankt
  • 608463167
  • verifiziert

Moin,

 

ich hab ein kleines Problem:

#!/usr/bin/python

import socket
from time import sleep

TCP_IP = '192.168.X.X'
TCP_PORT = 123
BUFFER_SIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send("D")

block = s.recv(BUFFER_SIZE)
data = block

# Diese Schleife hat mein Problem gelöst
while block:
   block = s.recv(BUFFER_SIZE)
   data += block

data = s.recv(BUFFER_SIZE)
s.close()

print data

Dieses Script soll sich mit einem Server verbinden.

Soweit so gut, die Daten abgeschickten Daten landen auch beim Server (ich kann bestätigen, dass das "D" ankommt). Die Antwort ist jedoch jedes mal "0".

Edit: Jetzt läuft es, siehe Code.

 

Ich erwarte eine Antwort von 5 Zeichen. Wenn ich das selber mit anderen TCP-Clients teste, habe ich keine Probleme.

 

 

Mfg.

SAR


Bearbeitet von SAR, 16 Dezember 2015 - 19:27 Uhr.

  • PaulaAbdul gefällt das

Eingefügtes Bild


#2
JohnR

JohnR

    Pentester

  • Premium Member
  • Likes
    18
  • 29 Beiträge
  • 1 Bedankt
  • Spender
  • iPhone
  • Windows, Linux, Mac OS
Hi

Bin eigentlich weniger Python, eher c++ Programmierer...

aber von der Konzeption her ist dein sleep sehr fehleranfällig...

warum nicht socket.accept(), was dir ja einen Boolean zurückliefert und dann while TRUE... damit wäre sichergestellt das der socket bereit ist und du brauchst das Ding nicht schlafen legen ^^

bloß als Gedankengang...

Gruß John
  • SAR und MDDD gefällt das

#3
SAR

SAR

    Regelmäßiger Übertreiber

  • Premium Member
  • Likes
    317
  • 394 Beiträge
  • 271 Bedankt
  • 608463167
  • verifiziert

socket.accept() stellt neue Verbindungen her (server-side).
Ich habe leider kein Befehl alá "socket.dataAvailable()" entdecken können.
 
Laut Doku soll "socket.recv(int)" auch solange warten, bis die Anzahl (<- siehe Parameter) der Bytes übertragen wurden oder es socket-Error gegeben hat. Ist scheinbar nicht so. :D
 
 
Edit: Sowas geht schon eher in die Richtung (da bekomme ich zumindest die ersten beiden Zeichen raus), aber die Antwort hat eine Variable Länge von 0-10, also kann ich nicht einfach die übertragenen Daten prüfen. 

data = s.recv(BUFFER_SIZE)
while data == "0":
   data += s.recv(BUFFER_SIZE)

 Edit²: Aber sowas lässt mir ja keine Ruhe. Jetzt habe ich die richtige Schleife gefunden. Siehe ersten Post. :D
 
Mfg.
SAR


Bearbeitet von SAR, 16 Dezember 2015 - 19:26 Uhr.

Eingefügtes Bild


#4
pdr0

pdr0

    Pentester

  • Premium Member
  • Likes
    86
  • 148 Beiträge
  • 82 Bedankt

Laut Doku soll "socket.recv(int)" auch solange warten, bis die Anzahl (<- siehe Parameter) der Bytes übertragen wurden oder es socket-Error gegeben hat. Ist scheinbar nicht so. :D

 

Naja.. Laut Doku musst du dich selber darum kümmern alles zu kriegen:

 

"Now we come to the major stumbling block of sockets - send and recv operate on the network buffers. They do not necessarily handle all the bytes you hand them (or expect from them), because their major focus is handling the network buffers. In general, they return when the associated network buffers have been filled (send) or emptied (recv). They then tell you how many bytes they handled. It is your responsibility to call them again until your message has been completely dealt with."

Please Login or Register to see this Hidden Content

 

Und sie nutzen auch den Ansatz

    def myreceive(self):
        chunks = []
        bytes_recd = 0
        while bytes_recd < MSGLEN:
            chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
            if chunk == '':
                raise RuntimeError("socket connection broken")
            chunks.append(chunk)
            bytes_recd = bytes_recd + len(chunk)
        return ''.join(chunks)

  • SAR gefällt das

#5
SAR

SAR

    Regelmäßiger Übertreiber

  • Premium Member
  • Likes
    317
  • 394 Beiträge
  • 271 Bedankt
  • 608463167
  • verifiziert

Hm, leider kenne ich nicht die genaue Länge des Rückgabewertes. (Arbeite seit gestern mit Python. :D)

Die Länge ist variabel und möchte jetzt auch nicht den TCP-Server zerpflücken, damit er noch Nachrichtenlängen jeweils ausgibt.

 

Aber ich glaube, die Möglichkeit die ich aktuell drin habe ist auch nicht schlecht (zumindest besser als 1s warten). Einfach solange lesen, bis keine Daten mehr da sind.

Da ich mich nur mit einem selbstprogrammierten Mikocontroller verbinde, bin ich mir auch relativ sicher, dass mir keiner einen Speicherüberlauf verursacht, indem einfach die ganze Zeit gesendet wird.

 

 

Mfg.

SAR 


Bearbeitet von SAR, 16 Dezember 2015 - 20:42 Uhr.

Eingefügtes Bild


#6
JohnR

JohnR

    Pentester

  • Premium Member
  • Likes
    18
  • 29 Beiträge
  • 1 Bedankt
  • Spender
  • iPhone
  • Windows, Linux, Mac OS
jo, genau so was meinte ich, das mit dem zu Tode quatschen hast ja schon erkannt... hier könntest ja easy die max Länge auf "genug aber nicht tödlich" festlegen und dann wenn nötig abbrechen...

zweite "Sicherung" wäre andersrum dann der Timeout falls dein gegenüber mal nicht gesprächig ist sonst wartet dein Socket bis zum jüngsten Tag ;-)


im C++ QT gibt es auch Funktionen für sowa alles die das schon vom Haus aus recht elegant lösen, selbst im Pythonport ist das verfügbar

Please Login or Register to see this Hidden Content



Warum man das nicht mit integriert hat ins "normale" Python verstehe wer will...
  • SAR gefällt das



  Thema Forum Themenstarter Statistik Letzter Beitrag

Besucher die dieses Thema lesen: 0

Mitglieder: 0, Gäste: 0, unsichtbare Mitglieder: 0


Dieses Thema wurde von 45 Mitglied(ern) gelesen


    , Ar@m!s, Avni, B1nary, BlackMuffinHD, Born2Hack, brilla, bumg2, Bypass, Caruso, casamonica, Creepx, Crowx88, CyberFlash, desmond, Emalik Xantier, Framerater, frechdax, headshotde, Hydra, Iron, jabba, JohnR, lNobodyl, loginman1, lolorollo, MDDD, n1nja, nikita, old_panther, Osed28, PaulaAbdul, pdr0, PHIPU, R3s1stanc3, roid, rsneumann, SAR, smc2014, Take1T, Torenjk, Toskom4n, twixeis, vital, Xenio
Die besten Hacking Tools zum downloaden : Released, Leaked, Cracked. Größte deutschsprachige Hacker Sammlung.