Socket-Software

Gast #4049460
Lesenswert?

Hallo zusammen.

ich habe ein kleines Projekt im Studium erhalten, ein Programm zu 
schreiben, welches einen Socket erstellt und über einen String an das 
verbundene Gerät (IP/Port) schickt.

Nun möchte ich das Ganze mal ausprobieren. Leider finde ich kein 
Programm, mit dem man sehen kann, ob meine programmierte Software nun 
auch richtig den Socket/die Verbindung aufbaut bzw. ob der String auch 
entsprechend rausgeschickt wird.
Außerdem möchte ich, dass ich einen Response an meine Software schicken 
kann, damit ich sehe, wie diese reagiert.

Wisst ihr was ich meine?

Gibt es da so etwas wie ein "Terminal" für COM-Schnittstellen, nur eben 
auf Netzwerkbasis?


Vielen Dank!
#4049469
Lesenswert?

Lars schrieb:
> Leider finde ich kein
> Programm, mit dem man sehen kann, ob meine programmierte Software nun
> auch richtig den Socket/die Verbindung aufbaut bzw. ob der String auch
> entsprechend rausgeschickt wird.

Das verstehe ich nicht. Entweder du musst in dem Projekt nur den Client 
schreiben, dann gibt es schon das entsprechende Serverprogramm, also 
benutze das.
Oder du sollst beide Programme erstellen dann mach das doch einfach.

Eine Suche nach "socket programmierung" fördert hunderte Treffer auch zu 
Programmbeispielen.
Hier z.B. für Windows nach 5sekunden Suche:
http://www.c-worker.ch/tuts/wstut_op.php
Gast #4049481
Lesenswert?

Hallo Leute!

Mein geschriebenes Programm ist die Client-Seite. Dort gebe ich IP und 
Port ein, um sich dann an ein Messgerät zu verbinden. Dieses Messgerät 
liefert auf eine entsprechende Anfrage eine Rückantwort.
Da ich dieses Gerät leider nicht zuhause zum testen habe, brauche ich 
eben etwas, was dieses Messgerät "simuliert".

Das heißt:

Ich schicke mit meinem Programm eine Anfrage raus ans Messgerät, 
daraufhin antwortet das Messgerät und mein Programm wertet die Antwort 
aus.

Kann WireShark und Co. das?

Danke!
Gast #4049525
Lesenswert?

Lars schrieb:
> Kann WireShark und Co. das?

nein, aber nichts hindert dich daran, einen primitiven Server selbst zu 
schreiben, z.B. mit perl:
1
 #!/usr/bin/perl -w
2

3
 use IO::Socket;
4
 use Net::hostent;              
5
 $PORT = 5000;                  
6
 $server = IO::Socket::INET->new(Proto => 'tcp', LocalPort => $PORT, Listen => SOMAXCONN, Reuse => 1);
7
 die "wtf" unless $server;
8
 while ($client = $server->accept()) {
9
   $client->autoflush(1);
10
   print $client "Willkommen am simulierten Messgeraet";
11
   while (<$client>) {
12
     next unless /\S/;
13
     if (/befehl/i){ 
14
        //machwas  
15
     }
16
   } continue {
17
      print $client "#> ";
18
   }
19
   close $client;
20
 }
Gast #4049544
Lesenswert?

Zwar eine nette Idee...aber nicht wirklich hilfreich. Woher weiß ich ob 
dann das "Server-"Programm fehlerfrei funktioniert.

Gibts da nichts in der Linux-Welt, womit man einfach einen Befehl auf 
die eth0 rausschicken kann?!
Gast #4049566
Lesenswert?

Lars schrieb:
> Zwar eine nette Idee...aber nicht wirklich hilfreich. Woher weiß ich ob
> dann das "Server-"Programm fehlerfrei funktioniert.
1
anon@linuxkiste:~$ cat testserver.pl
2
#!/usr/bin/perl -w
3

4
use IO::Socket;
5
use Net::hostent;
6
$PORT = 5000;
7
$server = IO::Socket::INET->new(Proto => 'tcp', LocalPort => $PORT, Listen => SOMAXCONN, Reuse => 1);
8
die "wtf" unless $server;
9
while ($client = $server->accept()) {
10
  $client->autoflush(1);
11
  print $client "Willkommen am simulierten Messgeraet";
12
  while (<$client>) {
13
    next unless /\S/;
14
    if (/quit/i){
15
        last;
16
    }
17
  } continue {
18
     print $client "#> ";
19
  }
20
  close $client;
21
}
22
anon@linuxkiste:~$ ./testserver.pl &
23
[1] 26402
24
anon@linuxkiste:~$ telnet localhost 5000
25
Trying 127.0.0.1...
26
Connected to localhost.
27
Escape character is '^]'.
28
Willkommen am simulierten Messgeraet
29
#> quit
30
Connection closed by foreign host.
31
anon@linuxkiste:~$
Gast #4049630
Lesenswert?

Ich sage nicht, dass es unnötig ist oder ätzend, aber wenn man schnell 
ein Ergebnis möchte, muss man sich erst selbst verzetteln...das nervt.

Aber gut zu wissen, dass es sowas noch nicht gibt, vielleicht werde ich 
bald reich. ;)
(Firma: O.D.I.S.) #4049684
Lesenswert?

Klaus Wachtler schrieb:
> derguteweka schrieb:
>> netcat koennt' dir vielleicht weiterhelfen.
>
> Genau das ist das Mittel der Wahl.
> Findet sich nur kaum in den vielen Antworten.

Das ist nicht das Mittel der Wahl, weil er ein Protokoll programmieren 
muss.
Netcat kann das zwar an andere Programme weiterleiten, das wird aber 
schmerzhaft, weil sich netcat immer wieder beendet wenn die Verbindung 
geschlossen wird.

Gruß

Olaf
Gast #4049699
Lesenswert?

Olaf Dreyer schrieb:
> Klaus Wachtler schrieb:
>> derguteweka schrieb:
>>> netcat koennt' dir vielleicht weiterhelfen.
>>
>> Genau das ist das Mittel der Wahl.
>> Findet sich nur kaum in den vielen Antworten.
>
> Das ist nicht das Mittel der Wahl, weil er ein Protokoll programmieren
> muss.
> Netcat kann das zwar an andere Programme weiterleiten, das wird aber
> schmerzhaft, weil sich netcat immer wieder beendet wenn die Verbindung
> geschlossen wird.
>
> Gruß
>
> Olaf

Na ja, ganz so schlimm ist das ja noch nicht. Der TE möchte ja erst mal 
nur mit Sockets rumspielen.

@TE programmiere dir doch die andere Seite selber. Da lernst du auch 
noch was dabei. Sockets sind ja keine Einbahnstraße.

Alternativ eine kleine Liste:

Realterm
Putty
netcat
telnet
socat

Die können sich alle auf einen Server verbinden. Da muss doch was dabei 
sein für dich.
(Firma: O.D.I.S.) #4049719
Lesenswert?

Udo Schmitt schrieb:
> Klaus Wachtler schrieb:
>> Genau das ist das Mittel der Wahl.
>
> Und wie machst du das, das Netcad sich als Server installiert und bei
> einem Request des zu testenden Clients diesem z.B. ein Magic Word
> zusendet, dann auf Daten des Clients wartet und -abhängig von diesen
> Daten- dann eine passende Antwort gibt?
> Und das alles in einer Verbindung.

Ich sag ja, mit netcat wird das wehtun.
Gast #4049733
Lesenswert?

So...ich habe dankend das Perl-Skript ausgeführt, jetzt habe ich aber 
schon Java-Seitig ein Problem:

Laut diesem Code soll er die Antwort des Perl-Programms doch eigentlich 
in der Konsole ausgeben...tut er aber leider nicht. :(
Die Anzahl der Bytes stimmen.

Wisst ihr, woran das liegen kann, dass er zwar die Anzahl der 
empfangenen Bytes anzeigt, aber nicht die Daten selbst?
1
import java.io.BufferedReader;
2
import java.io.IOException;
3
import java.io.InputStream;
4
import java.io.InputStreamReader;
5
import java.io.OutputStream;
6
import java.io.PrintStream;
7
import java.net.Socket;
8
import java.net.UnknownHostException;
9

10
class StringClient {
11

12
    public static void main(String[] args) {
13
        Socket socket = null;
14
        try {
15
            socket = new Socket("localhost", 3141);
16

17
            OutputStream raus = socket.getOutputStream();
18
            PrintStream ps = new PrintStream(raus, true);
19
            ps.println("Hallo Welt!");
20
            ps.println("Hallo Otto!");
21

22
            InputStream rein = socket.getInputStream();
23
            System.out.println("verf\u00FCgbare Bytes: " + rein.available());
24
            BufferedReader buff = new BufferedReader(new InputStreamReader(rein));
25
            
26
            while (buff.ready()) {
27
                System.out.println(buff.readLine());
28
            }
29

30
        } catch (UnknownHostException e) {
31
            System.out.println("Unknown Host...");
32
            e.printStackTrace();
33
        } catch (IOException e) {
34
            System.out.println("IOProbleme...");
35
            e.printStackTrace();
36
        } finally {
37
            if (socket != null)
38
                try {
39
                    socket.close();
40
                    System.out.println("Socket geschlossen...");
41
                } catch (IOException e) {
42
                    System.out.println("Socket nicht zu schliessen...");
43
                    e.printStackTrace();
44
                }
45
        }
46
    }
47
}
Gruß
Gast #4049766
Lesenswert?

Udo Schmitt schrieb:
> Und wie machst du das, das Netcad sich als Server installiert und bei
> einem Request des zu testenden Clients diesem z.B. ein Magic Word
> zusendet, dann auf Daten des Clients wartet und -abhängig von diesen
> Daten- dann eine passende Antwort gibt?
> Und das alles in einer Verbindung.

warum klingt das bei dir kompliziert?

'nc -l -p 3333' startet den Server. Die Anfrage siehst du im Klartext 
auf deiner Konsole. Dann kannst du vorbereitete Antworten per copy/paste 
zurück schicken und schauen, wie dein Programm reagiert.

Ist jetzt nicht wirklich schwer oder?
Gast #4049782
Lesenswert?

nicht"Gast" schrieb:
> Dann kannst du vorbereitete Antworten per copy/paste
> zurück schicken und schauen, wie dein Programm reagiert.
>
> Ist jetzt nicht wirklich schwer oder?

Aber nicht lustig, wenn man das zum Testen x-Mal in der Stunde machen 
muss. Es ist das typische Gefummel bei dem sich manche Programmierer 
einreden, sie wären extrem produktiv, weil sie ständig rumwuseln.
#4049807
Lesenswert?

Jay schrieb:
> nicht"Gast" schrieb:
>> Dann kannst du vorbereitete Antworten per copy/paste
>> zurück schicken und schauen, wie dein Programm reagiert.
>>
>> Ist jetzt nicht wirklich schwer oder?
>
> Aber nicht lustig, wenn man das zum Testen x-Mal in der Stunde machen
> muss. Es ist das typische Gefummel bei dem sich manche Programmierer
> einreden, sie wären extrem produktiv, weil sie ständig rumwuseln.

Also im OT steht, daß er ein selbgebautes Programm hat und testweise die 
Gegenseite simulieren will.

Genau dafür ist netcat ideal.

Daß man das nicht als Dauertest stundenlang machen will, ist doch gar 
nicht gefragt.
Gast #4049837
Lesenswert?

Wenns nur Strings sein sollen reichen Linux Boardmittel. netcat zum 
senden und empfangen von Strings und tcpdump um zu sehen was über die 
Leitung geht. Wenn du etwas zum Klicken brauchst, kannst du statt 
tcpdump natürlich auch wireshark nehmen.
Gast #4049922
Lesenswert?

Lars schrieb:
>
> Nun möchte ich das Ganze mal ausprobieren. Leider finde ich kein
> Programm, mit dem man sehen kann, ob meine programmierte Software nun
> auch richtig den Socket/die Verbindung aufbaut bzw. ob der String auch
> entsprechend rausgeschickt wird.

Du schreibst nicht für was : windows/linux
daher hier mal ein kleiner win server
einfach entpacken und starten, es wird nichts installiert, keine 
registry oder sonswas verändert.

entfernen kannst ihn dann idem du ihn einfach wieder löscht.

Deine CLient Message 'string'  steht dann im 'Incomming' Fenster drin


> Außerdem möchte ich, dass ich einen Response an meine Software schicken
> kann, damit ich sehe, wie diese reagiert.

Schreibst du in 'Server Response' rein

>
> Wisst ihr was ich meine?

Hoffe es :)

anbei ein kleiner Test Server
wenn du HEX, BIN oder andere Anzeigen auch brauchst musst dich etwas 
gedulden, hatte nur paar minuten zeit.

Port einstellen, Server Active setzen,
dein client auf die IP + Port setzen,
connecten, senden und kontrollieren ob alles durchläuft.
Feedback wäre nett, auch Verbesserungsvorschlag.
Ist einfach gehalten, also richtige Portnummer angeben
dann erst Server active setzen..

lg
rudi :)
Angehängte Dateien:
Gast #4049960
Lesenswert?

Lars schrieb:

> Wisst ihr, woran das liegen kann, dass er zwar die Anzahl der
> empfangenen Bytes anzeigt, aber nicht die Daten selbst?

bin mir nicht ganz sicher
aber probiere mal:

anstatt
>
1
> 
2
>             while (buff.ready()) {
3
>             System.out.println(buff.readLine());
4
>             }
5
>

mit dem

>
1
> 
2
>             while (buff.ready()) {
3
>             System.out.println(buff.nextLine() );
4
>             }
5
>

lg
#4050330
Lesenswert?

Es gibt eigentlich auf jedem netzwerkfähigen Unix-/Linuxserver eine 
echo Service. Die Port-Nummer habe ich gerade nicht zur Hand, steht 
aber in der /etc/services. Kann sein, dass der heute aus 
Sicherheitsgründen standardmäßig disabled ist, dann musst Du ihn erst 
freischalten. Dieser Dienst gibt einfach alles, was ihm geschickt wird, 
unverändert an den Client zurück. Also einfach bei einem Server Deiner 
Wahl auf diesen Port verbinden, String senden und Antwort einlesen. Wenn 
es exakt der gleiche String ist sollte Deine Verbindung funktionieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren