Probleme beim Datenempfand über UDP Socket.

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dcdead
User
Beiträge: 2
Registriert: Freitag 7. April 2006, 18:42

Hallo,

Ich hab hier eine Clientapplikation, die in C geschrieben ist und normalerweise von einem Server, der ebenfalls in C geschrieben ist Daten (sprich strings per UDP Socket empfängt). Den Source vom C Server habe ich, von dem Client, der die Daten sendet leider nicht.

Nun brauch ich aber einen Python Server dafür. Das Problem ist aber, dass dieser den Text abgehackt bekommt und die einzelnen Wörter sich teilweise wiederholen. Mit dem C Server kommen die Daten problemlos an.

Hier der C Server:

Code: Alles auswählen

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define MAX_MSG 512

int main(int argc, char *argv[]) 
{
  int sd, rc, n, cliLen;
  struct sockaddr_in cliAddr, servAddr;
  char msg[MAX_MSG];
  long port_to_use = 50007;

  sd=socket(AF_INET, SOCK_DGRAM, 0);
  if(sd<0) 
  {
    exit(1);
  }

  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(port_to_use);
  rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));

  while(1) 
  {
    memset(msg,0x0,MAX_MSG);
    cliLen = sizeof(cliAddr);
    n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *) &cliAddr, &cliLen);
    printf("%s",msg);
  }
return 0;
}
und hier der Pythonserver:

Code: Alles auswählen

from socket import *

PORT = 50007
BUFSIZE = 512

def main():
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(("", PORT))
    while 1:
        data = ""
        data, (client_ip,client_port) = s.recvfrom(BUFSIZE)

        if data == "":
           break
        else:
           print data

    s.close()

if __name__ == '__main__':
   main()

Wenn ich bspw. den String

============ blabla ============
foo: bar
foo2: bar2
=============================

geschickt bekomme, wird er mit dem Python server in etwa so dargestellt:

ar2
=======

Mit dem C Server klappts wie gesagt gut
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Also... Das kann eigentlich kein Python-Problem sein, denn (zumindest wenn man alles in Python implementiert):

Code: Alles auswählen

modelnine@phoenix ~ $ python
Python 2.4.2 (#1, Apr  3 2006, 12:10:45)
[GCC 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> serv = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
>>> serv.bind(("",10000))
>>> cli = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
>>> cli.sendto("blah",("localhost",10000))
4
>>> serv.recvfrom(512)
('blah', ('127.0.0.1', 32794))
>>>
modelnine@phoenix ~ $
Das Verhalten was Du siehst hab ich ehrlich gesagt bisher auch noch nie in dieser Form beobachtet (sprich auch bei C<->C, oder C<->Python); natürlich wenn der Puffer zu klein ist (aber das ist er in Deinem Fall ja wohl anscheinend keinesfalls, da beide Serverimplementierungen mit 512-byte Puffer auskommen), aber sonst: nein.

Ich würd eher mal auf ein Problem des Clients tippen, der die Daten irgendwie abgehackt schickt.

Ahso, was Du natürlich mal ausprobieren kannst:

print repr(data)

um zu gucken was "wirklich" in data drinsteht; es kann gut sein dass da irgendwo seltsame Zeichen drin sind die auf der Konsole falsch dargestellt werden und Dir dann das Gefühl geben dass der String abgeschnitten ist (wie zum Beispiel CR).

Und als letztes Dein Skript so anpassen dass from socket import * durch import socket und volle Namen ersetzt wird. from <blah> import * ist böse. Das ist aber zumindest soweit ich das sehen kann "nur" eine kosmetische Operation, nicht notwendig für die Funktionsweise.
--- Heiko.
dcdead
User
Beiträge: 2
Registriert: Freitag 7. April 2006, 18:42

Danke, du hast mir sehr geholfen. Konnte mit dem print repr(data) rausfinden, dass der Client immernoch ein \x00 hinter \n geschickt hat. Wenn ich das nun ausfiltere ist alles ok :)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

onnte mit dem print repr(data) rausfinden, dass der Client immernoch ein \x00 hinter \n geschickt hat.
Aaaah, ja. Ist mir jetzt auch aufgefallen dass die C-Quellen das stillschweigend voraussetzen... Große Sicherheitslücke. Kann jemand dem Designer dieses "Protokolls" mal Netzwerksicherheit beibringen? (weil den C-Server zum Core-dumpen zu bringen ist lächerlich einfach)

Egal, was reg ich mich auf... Ist ja nicht mein Rechner.
--- Heiko.
Antworten