PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Funktion zum Datenaustausch im Netzwerk



WDragon91
04.06.2008, 20:20
Hallo zusammen, ich suche eine hoffentlich einfache Funktion die es ermöglicht beispielsweise einen einfachen Integer Wert über das Netzwerk zu verschicken.

Also wie man es im Attachment erkennt, soll der Nutzer einen Wert eingeben beispielsweise 4 dieser soll dann übers Netzwerk verschickt werden, und beim anderen Nutzer ebenfalls in einer Konsolenanwendung ausgegeben werden.

Ich weiß nicht ob es so eine Funktion von Haus aus gibt, aber wäre schön wenn ihr mir das sagen könntet. Vll hat einer von euch soetwas schon programmiert, aber die "Ur" Befehle würde reichen will mich damit ein bisschen auseinander setzen.

Adressieren würde ich das ganze gerne über die IP adresse, müsste doch klappen, oder?

Danke schonmal für eure Hilfe :-)

robocat
04.06.2008, 21:18
(ganz) so einfach wie du es dir vorstellst geht es nicht, weil du sockets verwenden musst, und diese erst initialisiert werden müssen. dann brauchst du einen server, der auf verbindungen wartet und einen client, der versucht eine verbindung herzustellen. die beiden können dann daten austauschen.

hier ist das recht gut erklärt:
http://www.c-worker.ch/tuts/wstut_op.php

gruesse

WDragon91
04.06.2008, 22:01
Mhm das erfordert dann doch eine etwas längere Einarbeitungszeit. Hatte da an sowas wie den Befehl netsend gedacht, dient dazu Nachrichten im Netzwerk zu verschicken. Nur halt als C Funktion... Geht das ganze mit Linux vielleicht einfacher? Da sind die Konsolenanwendungen ja in der Regel noch weitaus mächtiger als bein Windows.

Auf meinem Lappi läuft Open Suse und auf meinem Rechner würde ich dann mit VMWareplayer auch Open Suse laufen lassen. Aber Linux programmierung ist denke ich nicht das selbe wie unter Windoof shit^^

Mfg Matze

Felix G
04.06.2008, 22:37
Naja, Sockets sind eigentlich garnicht soooo kompliziert wie sich das im ersten Moment anhört...


Bei der Übertragung von Daten per IP-Protokoll musst du dir als erstes mal eine einfache Frage stellen:

TCP oder UDP?

TCP ist ein verbindungsorientiertes Protokoll, d.h. du stellst eine TCP Verbindung zwischen den beiden Programmen her, und kannst dann deine Daten übertragen. Das TCP Protokoll stellt dabei sicher, daß deine Pakete auch tatsächlich beim Empfänger ankommen, und kümmert sich auch noch um zahlreiche weitere Dinge, die dir aber erstmal egal sein können.
(z.B. so Geschichten daß die Bandbreite bei mehreren TCP Verbindungen gleichmäßig aufgeteilt wird etc.)


UDP ist in so ziemlich jeder Hinsicht wesentlich unkomplizierter als TCP...
im Prinzip ist das UDP-Protokoll so einfach, daß man es schon fast nicht mehr als Protokoll bezeichnen kann, denn UDP Pakete werden schlicht und einfach 1:1 in IP Paketen verpackt und auf die Reise geschickt. Es muss keine Verbindung aufgebaut werden, man wählt einfach die passende Ziel-IP, und schickt seine Pakete ab. Nachteil der Geschichte ist, daß bei UDP erstmal nicht garantiert werden kann daß ein Paket überhaupt ankommt. Derartige Fehler können vom Protokoll garnicht erkannt werden, d.h. wenn du sicher sein willst daß ein Paket den Empfänger auch wirklich erreicht musst du dich selber darum kümmern (z.B. indem du den Empfänger eine Bestätigung abschicken lässt)



Mein Vorschlag wäre in deinem Fall ganz klar UDP, denn da musst du dich nicht darum kümmern irgendwelche Verbindungen auf- und vor allem korrekt wieder abzubauen.

WDragon91
05.06.2008, 22:18
So ich habe jetzt mal das UDP Tutorial von der Seite www.c-worker.ch ausprobiert mit folgendem Code

#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <conio.h>

//Prototypen

int startWinsock(void);

int main()
{
long rc;
SOCKET s;
char buf[256];
SOCKADDR_IN addr;
SOCKADDR_IN remoteAddr;
int remoteAddrLen=sizeof(SOCKADDR_IN);
rc=startWinsock();

if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
getch();
return 1;
}
else
{
printf("Winsock gestartet!\n");
} //UDP Socket erstellen

s=socket(AF_INET,SOCK_DGRAM,0);

if(s==INVALID_SOCKET)
{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
getch();
return 1;
}
else
{
printf("UDP Socket erstellt!\n");
} // addr vorbereiten

addr.sin_family=AF_INET;
addr.sin_port=htons(5999);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");

while(true)
{
printf("Text eingeben: ");
gets(buf);
rc=sendto (s,buf,strlen(buf),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

if(rc==SOCKET_ERROR)
{
printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("%d Bytes gesendet!\n", rc);
}

rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
if(rc==SOCKET_ERROR)
{
printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
getch();
return 1;
}
else
{
printf("%d Bytes empfangen!\n", rc);
buf[rc]='\0';
printf("Empfangene Daten: %s\n",buf);
}
}
}

int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}


Habe in einem anderen Forum gelesen das es eigentlich funktionieren soll, allerdings meckert mein Linker noch rum. Habe als Compiler
Mircosoft Visual C++ 6.0


Linker-Vorgang läuft...
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _recvfrom@24
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sendto@24
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _inet_addr@4
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _htons@4
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAGetLastError@0
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _socket@12
Kom.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAStartup@8
Debug/Kommunika UDP.exe : fatal error LNK1120: 7 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.



Unter Einstellungen kann ich noch diverse dlls einlinken, allerdings weiß ich nicht welche, habt ihr vielleicht eine Ahnung? Eigentlich ist diese Copy & Paste geschichte nicht nach meiner Mütze aber erstens ist es in der Schulzeit noch zu stressig sich für so ein kleines Projekt damit tiefgründig ausseinander zu setzten und zweitens lernt man an einem funktionierden Code doch wesentlich einfacher.



// EDIT Man wer lesen kann ist klar im Vorteil^^ auf der Seite stand sogar die lib die ich noch einfügen muss.
So werde mich am WE mal ans testen und modifizieren machen, danke für eure Hilfe ich melde mich dann!

Mfg Matze

Ceos
06.06.2008, 10:37
verzeih die frage, aber was hat das in erster linie mit atmel controllern zu tun ? sonst würde ich dir dringen raten mal ins www.c-plusplus.de forum zu gehen, dort findest du haufenweise topics zur socketprogrammierung, mein tipp, WINAPI subforum ...

leider hab ich meinen laptop frisch formatiert und mein PC ist bis nächste woche nicht zugänglich, sonst könnt ich dir meine winsocket lib geben, die baut auf eventgesteurte sockets zurück

WDragon91
06.06.2008, 14:08
Hi Ceos, das ist halt nur ein Teil meines größenwahnsinnigen Planes :-) Nein verstehe deine Frage ist ja auch berechtigt, am Ende sollen dann die Daten ans RN-Controll über die RS Schnittstelle übertragen werden. "Brauche das also als Fernbedienung".

Der Grund warum ich das hier ins Roboternetz poste ist im Grunde genommen einfach, ich weiß einfach das sich hier viele kompetente Leute tummeln, natürlich gibt es die im c++ Forum auch, aber ich wollte es erstmal hier probieren.

Wenn mein Quellcode nicht funktioniert, und du deine Libs noch irgendwo hast wäre ich dir Dankbar :-)
Mfg Matze

Ceos
06.06.2008, 14:36
EDIT: meine bibliothek ist im prinzip nur ne cpp file die alle üblichen c-socket befehle in methoden fasst und ein WENIG automatismus beinhaltet, du musst theoretisch nur ein waitforsingleobject(); in einer schleife aufrufen und wenn der socket etwas empfängt oder sagen will setzt er das event und der waitfor beendet mit WAIT_RESPONE_0 glaube ich, dann musst du die daten nurnoch auslesen und auswerten und das flag zurücksetzen

http://www.b-redemann.de/produkte-ethernet.shtml
das ist das unten erwähnte modul im bild rechts
/EDIT

größenwahn zeugt nur von überfliessender kreativität ....

huh? wie ? moment ? also doch !
hehe dann versuch es doch mal mit nem "nackigen" mega32 und nem ethernetmodul in kombination mit ner schicken AVR bibliothek die DHCP UDP IP beherrscht ....

die lib findest du hier

https://www.roboternetz.de/phpBB2/viewtopic.php?t=40807

und hier das bild von meinem aufbau (also UDP senden und empfangen geht klasse, DHCP NOCH nicht, die VT100 genannte hyperterminal konsole ist auch klasse)

WDragon91
06.06.2008, 21:47
Hi Coes, sehr schöner Versuchsaufbau. Die Kommunikation habe ich jetzt endlich soweit mit dem UDP Protokoll im Griff, das ich normal Daten senden kann.

Das mit der Ethernet Schnittstelle hört sich sehr interressant für zunkünftige Projekte an, in den Sommerferien wollte ich erstmal ein paar Netzwerkkabel verlegen, da könnte man sicher damit einiges Anstellen, Licht anschalten, Steckdosen schalten, sehr praktisch. Hehe bald brauch ich gar nicht mehr aufstehen xD :-)

Die Kommunikation läuft soweit eigentlich stabil, habe es jetzt testweise über einen Switch laufen gehabt, später soll das ganze dann über einen WLAN-Router laufen, der Laptop soll auf einem kleinen Bot platz finden, und die Daten die ich ihm über das UDP Protokoll sende über RS232 an das RN-Board weiterleiten. Wie sieht es eigentlich mit der Genauigkeit aus? Hatte gedacht das ich zur Sicherheit Prüfsummen und Doppelsendungen hinzufüge. Also wenn zweimal absolut das selbe gesendet wurde, soll er die Aktion durch führen.

Ich glaube um deinen Versuchsaufbau richtig nach vollziehen zu können und es selber zu programmieren, bedarf es noch einiger Zeit, das ist schon etwas schwieriger als das ich es mir zutrauen würde.


Gibt es eigentlich für C die Möglichkeit eine grafische Oberfläche zu programmieren?? Es würden erstmal 4 Buttons ausreichen. In anderen Programmiersprachen ist das eigentlich ganz simpel also in Javascript.
Button hingezaubert dann onclick(Funktion) und schon hatte man seine Funktion aufgerufen gibbet es sowas auch für c?

Werde dann noch ein wenig an meinem größenwahnsinnigen Plan weiterarbeiten :-) Mein Problem ist immer nur das ich viele verschiedene Sachen anfange und nicht zuende bringen :) Der einzige Vorteil der daraus entsteht ist das man "alles" mal gemacht hat .

Mfg Matze

Ceos
07.06.2008, 00:43
JEIN

du kannst mal versuchen ob du mit dem BORLAND TURBO EXPLORER klarkommst, da sind auch schon fertige module für UDP Clients mit drinne, aber du bisndest dich damit erstens an c++ und zweitens auch an windoof

auf arbeit hab ich die "vollversion" aka Borland development studio 2k6 und zu hause die kostenlosversion turboexplorer, unterschied ist das der explorer auf eine programmiersprache begrenzt ist und ich bin recht zufrieden, drag & drop oberflächenbau, eventgesteuerte module, RELATIV einfacher thread-support (anfänger FINGER WEG)

zur datensicherheit, bei UDP empfehle ich ein 4 byte startsignal uz definieren, darauf folgend 1 byte für die paketlänge INKLUSIVE startsignal und prüfsumme, macht 256byte - 4byte signal -1byte CRC = 251byte datenladung maximal, sollte wohl reichen ?! BEDENKE es kann auch passieren das ein paket mal NICHT vollständig ankommt sondern in 2 teilen, wobei im worst case NACH dem 2ten teil gleich der 1te teil des nächsten paket angehängt ist ... das ist EVIL HELL WORST CASE ... aber bei den belastungen die wir auf arbeit im fehlerfall schonmal produzieren bereits vorgekommen XD

WDragon91
17.06.2008, 13:58
Hallo, tut mir leid das ich mich so lange nicht mehr gemeldet habe. Habe mich jetzt dazu entschieden mit der grafischen Benutzeroberfläche noch ein wenig zu warten. Nach den Ferien ist in der Schule Java angesagt und damit dann auch grafik Programmierung. Das mit der Datensicherheit klingt schonmal ganz gut :-) Hoffentlich krieg ich das hin.

Ceos
17.06.2008, 18:12
huh? obacht!!!! Java verwendet sehr spezifische sockets, die mit nem rohen ethernet controller auch zufriedenzustellen kann schwierig werden .... PS du hast mein beileid Swing, AWT und SWT von hand schreiben ist tödlich langweilig und nervend .... ich greif hier auf SDKs mit nem Oberflächenframework zurück (Borland Turbo Explorer C++, mein favorit, oder für Java Jigloo Editor Plugin unter Eclipse)

WDragon91
17.06.2008, 22:24
Na das kann dann ja was werden :-) Lasse mich mal überraschen bis jetzt ist der Unterricht eigentlich ganz interressant. Programmieren gerade in C ein kleines Strategie Spiel werde es dann mal hochladen, da wird dann auch hoffentlich das UDP Protokoll zum Einsatz kommen, es muss nur ein array übertragen werden. Mit welcher Programmierumgebung wir arbeiten werden weiß ich noch gar net. Es ist doch aber möglich, C in Java einzubinden, oder? Es würde schon reichen wenn über 4 Buttons 4 Funktionen aufrufen kann.

Jetzt stellt sich mir gerade eine zweite Frage. Die Konsolenanwendung ist ja in C geschrieben und ich will über die RS232 Schnittstelle Daten an das RN-Controll übertragen das in Basecom programmiert ist. Wie ich auf den Input warte weiß ich aus dem Tut, aber wie ich Daten an die RS232 Schnittstelle sende weiß ich leider nicht(noch nicht). Gibt es eigentlich Probleme wenn ich mit C über RS232 Sende und mit Basecom empfange?

Mfg Matze

Ceos
18.06.2008, 00:48
buhuuu dann lieber TCP ... UDP und arrays ... da machste dich nur selber unglücklich ... vertrau mir ^^

udp würde ich vll. zum server finden verwenden ... du bist halt nicht der einzige der UDP pakete im netzwerk sendet ... java zu java sind socket spitze, daten und ganze klassen lassen sich serialisieren und einfach in den stream schreiben, c socket zu c socket ist aufwendiger aber man hat mehr kontrolle ^^ java ist was für applets handys und multiplatform aber sonst find ichs eher besser in platformoptimierten c / c++ zu programmieren ... der windows socket z.B. unterstützt Event gesteuertes empfangen.

c in java GEHT, ist aber nicht SO supereinfach ... ich selber habs immer vermieden ..... das mit RS232 bekommst du schon hin ^^