kostenloser Webspace werbefrei: lima-city


Netzwerkapplikationen unter C/C++

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    phoenix

    phoenix hat kostenlosen Webspace.

    Kann man mit C Netzwerkanwendungen basteln??

    Wenn nein, mit C++?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c*t

    @phoenix: kannst du mal sagen, ws du genau machen willst?
    weil das doch ein breitgef?cherteres thema ist. w?re nett, dann k?nnen wir dir bestimmt auch genauer auf deine frage antworten.:wink:
  4. Netzwerkanwendungen sind im allgemeinen mit C m?glich.
    Bestes Beispiel daf?r ist wohl Linux.
    Gro?artig Ahnung wie man sowas realisiert hab ich allerdings keine.

    lg
  5. n*****a

    Joa wie schon gesagt h?ngt das ganz davon ab was du machen willst. Am einfachsten(und am portabelsten) sind TCP/UDP Sockets!
  6. f**********x

    Es kommt darauf an ob du mehr in die Richtung Client oder Server Programmierung gehen m?chtest. Generell ist ein Programmieren von Netz Apps unter C und C++ kein Prob :smile:
  7. Autor dieses Themas

    phoenix

    phoenix hat kostenlosen Webspace.

    -> @phoenix: kannst du mal sagen, ws du genau machen willst?
    -> weil das doch ein breitgef?cherteres thema ist. w?re nett,
    -> dann k?nnen wir dir bestimmt auch genauer auf deine frage
    -> antworten.:wink:

    Das wei? ich ja selber ned so genau:angel:
    Aber ich wollte mich mal dran machen f?r unser Heimnetzwerk ein paar tools zuschreiben, wie zB ein kleiner Chat
  8. r********d

    Ja kann man, generell w?rde ich da aber Java den Vorzug gehen (Stichworte RMI, Applets usw.)
  9. lordoflima

    Admin Kostenloser Webspace von lordoflima

    lordoflima hat kostenlosen Webspace.

    Wie genau kann man einen Socket offenhalten in C/C++ und wie kann man zu einem Connecten / Daten sende/empfangen und den Socket/Die Verbindung schliessen?
  10. Also f?r einen kleinen Chat im Homenetzwerk kann man beruhigt die cgi-Schnittstelle des Webservers verwenden, da mu? man sich dann um diese Dinge nicht k?mmern :-)
    Ansonsten ein klares Ja, C ist geeignet (und C++ auch). Bei C++ lohnt es sich evtl. die QT-Bibliothek zu benutzen, wenn der Schwerpunkt auch auf Anwendungen mit grafischer Oberfl?che liegt. F?r Server w?rde ich pers?nlich eher C empfehlen, zumindest solange die Erweiterbarkeit des Codes im Vordergrund steht.

    @Lord, die sockets erzeugt man mit socket(), dann wird mit connect() eine verbindung aufgebaut bzw. mit Listen() auf einen client gewartet, den man dann mit accept() annehmen kann. Lesen und schreiben funktioniert wie auf normale Dateien auch, nat?rlich l??t sich der Streampointer nicht (sinnvoll) manipulieren. Wen man mal von extremen Inaktivit?tsperioden absieht braucht man sich um das offenhalten der Sockets gar nicht zu k?mmern. Falls die Verbindung unterbrochen wird liefert read() dann halt einen entsprechenden Fehlercode zur?ck, den man auswerten mu?.

    F?r die Systemprogrammierung unter Linux kann ich im ?brigen Helmut Herold: Linux/Unix Systemprogrammierung empfehlen. Wenn man mal etwas Papier in der Hand halten m?chte. Leider ist das Badewannnenformat deutlich ?berschritten worden :-(
  11. lordoflima

    Admin Kostenloser Webspace von lordoflima

    lordoflima hat kostenlosen Webspace.

    -> Also f?r einen kleinen Chat im Homenetzwerk kann man
    -> beruhigt die cgi-Schnittstelle des Webservers verwenden, da
    -> mu? man sich dann um diese Dinge nicht k?mmern :-)
    -> Ansonsten ein klares Ja, C ist geeignet (und C++ auch). Bei
    -> C++ lohnt es sich evtl. die QT-Bibliothek zu benutzen, wenn
    -> der Schwerpunkt auch auf Anwendungen mit grafischer
    -> Oberfl?che liegt. F?r Server w?rde ich pers?nlich eher C
    -> empfehlen, zumindest solange die Erweiterbarkeit des Codes
    -> im Vordergrund steht.
    ->
    -> @Lord, die sockets erzeugt man mit socket(), dann wird mit
    -> connect() eine verbindung aufgebaut bzw. mit Listen() auf
    -> einen client gewartet, den man dann mit accept() annehmen
    -> kann. Lesen und schreiben funktioniert wie auf normale
    -> Dateien auch, nat?rlich l??t sich der Streampointer nicht
    -> (sinnvoll) manipulieren. Wen man mal von extremen
    -> Inaktivit?tsperioden absieht braucht man sich um das
    -> offenhalten der Sockets gar nicht zu k?mmern. Falls die
    -> Verbindung unterbrochen wird liefert read() dann halt einen
    -> entsprechenden Fehlercode zur?ck, den man auswerten mu?.
    ->
    -> F?r die Systemprogrammierung unter Linux kann ich im
    -> ?brigen Helmut Herold: Linux/Unix Systemprogrammierung
    -> empfehlen. Wenn man mal etwas Papier in der Hand halten
    -> m?chte. Leider ist das Badewannnenformat deutlich
    -> ?berschritten worden :-(
    ->

    Welche Header-Datei brauche ich denn daf?r? Ich will keinen bl?den Chat machen, sondern nen LAN-Filesharing-System
  12. Das mit dem Chat war wohl ein Forenkollege :-)

    wie w?rs mit 'apropos socket' unter der Linux-Komandozeile?
    das liefert alle Befehle die was mit sockets zu tun haben und f?r die die entsprechenden Man(ual) Eintr?ge installiert sind.

    socket(2) ben?tigt die folgenden Header-Dateien:

    #include <sys/types.h>
    #include <sys/socket.h>

  13. Also fuer'n Lan-Filesharing wuerde sich ein FTP-Server anbieten, da braucht man nicht soviel selbst programmieren *g* und ist auch bei Linux dabei

    Ansonsten auf programmersheaven.com, da gibts haufenweise Beispielcode.
  14. d****5

    Schau doch mal in der Hilfe von Borland C++ Builder bzw. deines C++-Programms
  15. d****y

    Gibt es eigentlich irgentwo ne Sammlung an Header-Dateien die mann f?rs Netzwerk programmieren nutzen kann ??
  16. was muss man includen, wenn man im homenetzwerk mit sockets arbeiten will und trotzdem z.B. "cout << "blabla"; " Nutzen kann?

    also:

    #include "stdafx.h"
    #include "iostream.h"

    void main()
    {
    cout << "Hallo";

    //irgendwelcher netzwerk-code
    }

    kann mir vielleicht irgendwer auch beispiele f?r ein netzwerk-prog geben???
    :biggrin:
  17. 0******a

    ands schrieb:
    was muss man includen, wenn man im homenetzwerk mit sockets arbeiten will und trotzdem z.B. "cout << "blabla"; " Nutzen kann?

    Da du auch "stdafx.h" einbindest, arbeitest du wohl mit Visual C++ unter Windows. Dann musst du winsock2.h einbinden.



    ands schrieb:
    kann mir vielleicht irgendwer auch beispiele f?r ein netzwerk-prog geben???

    Was willst du denn genau machen? Und brauchst du ein funktionierendes Beispiel zum Testen oder reicht die vielleicht sogar Pseudocode? Wie gut verstehst du, wie ein Netwerk funktioniert und willst du TCP/IP benutzen oder NetBEUI oder vielleicht gar ein Novellnetzwerk?!



    ands schrieb:
    #include "iostream.h"

    Falls das bei dir funktioniert, ist ja gut, aber normalerweise m?sste es
    #include <iostream.h>
    heissen.
  18. das problem ist nur, wenn ich stdafx.h einbinde kommt ein fehler bei iostream.h - wieso?

    ich wollte gerne einfach nur ein Beispiel, wo man z.B. eine nachricht senden kann (nur so zum lernen) , weil bei den tutorials, die ich bisher gelesen habe, es mit dem netzwerk nie funktioniert!
    mit tcp/ip fang ich mal an (soll ja auch einfacher sein!?)

    (ich benutze visual c++ von Ms)

    Beitrag ge?ndert am 8.12 07:13 von ands
  19. 0******a


    das problem ist nur, wenn ich stdafx.h einbinde kommt ein fehler bei iostream.h - wieso?

    stdafx.h wird vom Projekt Assistenten automatisch erstellt und ist f?r die Einbindung der MFC Header zust?ndig. Die MFC hat manchmal Probleme mit anderen Headerdateien, die sie selbst benutzt.


    Hier ein Beispiel f?r deinen Compiler:
    #include <stdio.h>
    #include <winsock2.h>
    
    
    #define DAYTIME_PORT 13
    #define PTB_IPADDR "192.53.103.103"
    #define DATETIME_LEN 24
    
    int main()
    {
       WSADATA stWSA;
       sockaddr_in stSockAddr;
       SOCKET tdSock;
       int iRet;
       char acBuf[DATETIME_LEN + 1];
       unsigned short int usCounter;
    
    
       WSAStartup(MAKEWORD(2,0), &stWSA);
    
       
       memset(&stSockAddr, 0, sizeof(SOCKADDR_IN));
       stSockAddr.sin_family = PF_INET;
       stSockAddr.sin_port = htons(DAYTIME_PORT);
       stSockAddr.sin_addr.S_un.S_addr = inet_addr(PTB_IPADDR);
    
       
       tdSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       if (tdSock == INVALID_SOCKET)
       {
          printf("Socket konnte nicht erstellt werden\n");
          return 1;
       }
    
       iRet = connect(tdSock, (PSOCKADDR)&stSockAddr, sizeof(SOCKADDR));
       if (iRet != 0)
       {
          printf("Konnte Verbindung nicht aufbauen\n");
          return 1;
       }
    
       usCounter = 0;
    
       while (usCounter != DATETIME_LEN)
       {
          iRet = recv(tdSock, &acBuf[usCounter], DATETIME_LEN - usCounter, 0);
    
          if (iRet == 0)
          {
             printf("Verbindung wurde vom Server geschlossen\n");
             return 1;
          }
    
          usCounter += (unsigned short int) iRet;
       }
    
       closesocket(tdSock);
       WSACleanup();
    
       acBuf[DATETIME_LEN] = '\0';
    
       printf("Antwort des Server:\n%s\n", acBuf);
    
       return 0;
    }


    Zur Erkl?rung:
    Das Programm verbindet sich mit einem anderen Rechner auf Port 13. Normalerweise l?uft auf Port 13 bei Servern ein Daytime Server, der, sobald man sich mit ihm verbindet, die aktuelle Uhrzeit und Datum des Systems schickt und dann die Verbindung schliesst. In diesem Fall verbinden wir uns zu dem Rechner 192.53.103.103, was die IP Adresse eines der Timeserver der PTB (Physikalisch Technische Bundesanstalt) ist.

    WSAStartup():
    Muss immer auf Windowssystemen aufgerufen werden, bevor man irgendwas mit Sockets macht. Diese Funktion macht nichts anderes als die DLL, in der die TCP/IP Netzwerkfunktionen f?r Windows hinterlegt sind, in den Speicher zu laden. Solange du auf einem der bisherigen Windows 32 Bit Betriebssysteme programmierst, kannst du die Zeile mit WSAStartup() einfach so kopieren und benutzen.

    Struktur stSockAddr:
    Diese muss vor dem Aufruf von connect() mit einigen Daten bef?llt werden, damit Windows weiss, was f?r eine Netzwerkverbindung wir herstellen (z.B. welches Protokoll). Die ganzen Zeilen, in denen stSockAddr bef?llt wird, kannst du einfach so ?bernehmen (bis auf die IP-Adrsse und die Portnummer nat?rlich) und immer wieder verwenden, solange du deine Verbindungen mit TCP/IPv4 aufbauen willst.

    htons():
    Auf verschiedenen Systemen werden die Daten, die gr?sser als ein Byte sind verschieden gespeichert. Es gibt Systeme, die bei einer zwei Byte grossen Variablen das erste Byte im Speicher zuerst ablegen und danach erst das zweite. Andere Systeme machen das genau anders herum. Um bei der Kommunikation zwischen verschiedenen Systemen Komplikationen aufgrund der Bytereihenfolge zu vermeiden, hat man sich darauf geeinigt, die Bytes, die ?ber das Netzwerk gehen nur in einer bestimmten Reihenfolge zu versenden. Bei manchen Systemen werden also die Bytes erst umgedreht, bei anderen macht die Funktion gar nichts, weil die Bytes eh schon in der richtigen Reihenfolge sind. Trotzdem sollte man unabh?ngig vom System die Funktionen htons(), ntohs(), htonl() und ntohl() immer benutzen. Mehr Infos zur Bytereihenfolge findest du, wenn du im Interner nach "Big Endian" und "Little Endian" suchst.

    inet_addr():
    Macht aus einer IP-Adresse, die als String im xxx.xxx.xxx.xxx Format vorliegt die entsprechende 4 Byte Zahl.

    socket():
    Erstellt ein Handle des Systems auf einen Socket. ?ber die R?ckgabe dieser Funktion l?uft die ganze Netzwerkkommunikation ab. Falls keine Handles im System mehr verf?gbar sind (Windows kann theoretisch nur ca. 65000 verwalten) oder ein anderer Fehler auftritt, gibt die Funktion INVALID_SOCKET (= -1, so wie bei den meisten anderen Systemen auch) zur?ck.

    connect():
    Mit dem erstellten Socket und den Daten, die wir vorhin in stSockAddr gespeichert haben, wird nun eine Verbindung aufgebaut. Der dritte Parameter ist n?tig, weil die Funktion so die Gr?sse der Struktur erf?hrt, die als zweiter Parameter ?bergeben wurde. Die kann n?mlich variieren, wenn man z.B. ein anderes Protokoll benutzt. Falls connect() 0 zur?ckliefert, wurde die Verbindung aufgebaut, ansonsten ist ein Fehler aufgetreten.

    Vom Server bekommen wir jetzt 24 Bytes als Antwort, die in lesbarer Form Datum und Uhrzeit angeben. Man kann nicht immer davon ausgehen, das alle gew?nschten Bytes auf einmal ankommen, daher die while Schleife, in der die bisher empfangenen Bytes mitgez?hlt werden. Bei 24 Bytes ist das eigentlich nur Theorie, das nicht alle auf einmal ankommen.

    recv():
    Schreibt die empfangenen Bytes in einen Puffer (hier acBuf). Falls 0 zur?ckgegeben wird von recv(), wurde die Verbindung geschlossen, andere Werte zeigen die L?nge der (in diesem Funktionsaufruf) empfangenen Daten. Der dritte Parameter gibt an, wie viele Bytes man h?chstens in den Puffer geschrieben haben will. Der vierte Parameter ist nur spezielle Anwendungen interessant, kann also so gut wie immer 0 bleiben.

    Nach Verlassen der while Schleife schliessen wir den Socket mit closesocket() und geben somit auch das Handle f?r das System wieder frei. Schliesst man den Socket nicht mit closesocket(), so wird das unter Windows automatisch nach Beendigung des Systems nachgeholt. Mit WSACleanup() wird die geladene Winsock DLL wieder aus dem Speicher entfernt, falls sie nicht mehr ben?tigt wird (das entscheidet das System selbst). acBuf schliessen wir mit einem Nullbyte ab, weil recv() das nicht macht. Dann folgt die Ausgabe.


    Nachtrag:
    Wenn man bei den auftretenden Fehlern der Netzwerkfunktionen (z.B. connect(), recv(), closesocket() etc.) die Fehlernummer wissen will, um so die Fehlermeldung bestimmen zu k?nnen, dann muss man sich unter Windows der Funktion WSAGetLastError() bedienen.
    Ich habe hier keine weitere Fehlerbehandlung eingebaut, weil es dann zu un?bersichtlich wird.
    Ausser den hier vorgestellten Funktionen gibt es unter Windows noch ?quivalente Funktionen, die mit WSA... (z.B. WSARecv() statt recv() )beginnen und teilweise besser arbeiten. Ich benutze nur gerne diese Funktionen, weil die Portierung auf andere Betriebssysteme dann eher m?glich ist.

    Beitrag ge?ndert am 8.12 16:50 von 0-checka
  20. ja, nur leider treten bei mir immer folgende Fehler auf: :pissed:


    Compiling...
    nettest.cpp
    Linking...
    nettest.obj : error LNK2001: unresolved external symbol __imp__WSACleanup@0
    nettest.obj : error LNK2001: unresolved external symbol __imp__closesocket@4
    nettest.obj : error LNK2001: unresolved external symbol __imp__recv@16
    nettest.obj : error LNK2001: unresolved external symbol __imp__connect@12
    nettest.obj : error LNK2001: unresolved external symbol __imp__socket@12
    nettest.obj : error LNK2001: unresolved external symbol __imp__inet_addr@4
    nettest.obj : error LNK2001: unresolved external symbol __imp__htons@4
    nettest.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
    Debug/nettest.exe : fatal error LNK1120: 8 unresolved externals
    Error executing link.exe.

    nettest.exe - 9 error(s), 0 warning(s)
  21. 0******a

    Du musst in das Projekt die Bibliothek ws2_32.lib einbinden. Linkfehler mit der Meldung sind meistens fehlende Bibliotheken. In der MSDN kannst du n?chstes Mal auch nachschuen, welche Bibliothek einzubinden ist.
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!