Daten auf Port schicken

Passer

Erfahrenes Mitglied
Hallo,

ich bin grade dabei Funktionen aus einem Programm aus dem c# Teil in eine C++ Bibliothek zu portieren. Leider gibt es hier und da einige Probleme im Bereich Networkng (mag daran liegen, das ich noch nicht soooo der C++ Freund bin ;)

Folgendes soll passieren:
1) Datei einlesen (erledigt)
2) Datei in Segmente einteilen (erledigt)
3) Der Datenstrom soll nun auf einen (lokalen) Port geschickt werden (da liegt das Problem)
4) Der Datenstrom soll von einer anderen Komponente von dem vorher spezifizierten Rechner:port wieder eingelesen werden.
-----

Mein Problem liegt also darin, Daten ins Netzwerk zu senden und diese dann wieder zu empfangen.
Unter c# war das alles sehr einfach. Ich hoffe, dass es für C++ler auch sehr einfach ist ;)
----
Das ganze soll unter Windows und mit dem Visual Studio 8 passieren.

MfG
Christoph
 
Hallo Christoph,

grundsätzlich funktioniert's ähnlich wie bei C#, aber die Funktionsaufrufe sind natürlich anders ;)

Du wirst dich dazu mit Socket-Programmierung auseinandersetzen müssen. Da aber vermutlich nur einen TCP/IP-Client brauchst, bleibt der Aufwand überschaubar.
Hier mal die wichtigsten Funktionen:
  • WSAStartup() - Winsock initialisieren
  • socket() - Socket erzeugen
  • connect() - Verbindung aufbauen
  • send() - Daten senden
  • recv() - Daten empfangen
  • closesocket() - Verbindung beenden
Gruß
MCoder
 
Da es ja soweit ich weiss in C++ keine "standardLibs" in dem Sinne gibt (in dem Sinne, wies bei C# innerhalb des system-namespaces ist), würd ichs nett findne, wenn Du mir die dafür nötigen Includes verrätst ;)

Dankeauf jedne Fall schonmal für das bis jetzt gepostete.

MfG
Christoph
 
Hier mal ein einfaches Beispiel, da solltest du alle nötigen Infos herausziehen können.

Gruß
MCoder
C++:
#include <string>
#include <winsock.h>

#pragma comment (lib, "Ws2_32.lib")

int main(int argc, char* argv[])
{
    ///////////////////////////////////////////////////////////
    // Socket initialisieren (nur einmal beim Programmstart)
    ///////////////////////////////////////////////////////////

    WSADATA wsa;

    if( WSAStartup(MAKEWORD(2,2), &wsa) )
    {
        return 1;  // Initialisierung fehlgeschlagen
    }

    ///////////////////////////////////////////////////////////
    // Verbindung aufbauen und Senden bzw. Empfangen
    ///////////////////////////////////////////////////////////
   
    std::string strHost = "servername";   // Hostname
    std::string strIP   = "10.1.100.255"; // HostIP
    int    nPort        = 1234;           // Portnummer

    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if( sock != INVALID_SOCKET )
    {
        struct sockaddr_in saddr;
        struct hostent *pHost;
        
        // Verwendung des Servernamens
        
        pHost = gethostbyname(strHost.c_str());

        // oder Verwendung einer IP-Adresse

        unsigned int addr  = inet_addr("10.1.100.255");
        pHost = gethostbyaddr((char *) &addr, 4, AF_INET);


        saddr.sin_family = AF_INET;
        saddr.sin_port   = htons(static_cast<u_short>(nPort));
        saddr.sin_addr   = *reinterpret_cast<struct in_addr*>(pHost->h_addr);

        if( connect(sock, reinterpret_cast<struct sockaddr *>(&saddr), sizeof(saddr)) != 0 )
        {
            // Senden
            ///////////////////////////////////////////////////
        
            char SendBuffer[] = { 0x00, 0x01, 0x02, 0x03 };    // Sendedaten zuweisen
        
            if( send(sock, SendBuffer, sizeof(SendBuffer), 0) != SOCKET_ERROR )
            {
                // Senden Ok
            }
                
            // Empfangen
            ///////////////////////////////////////////////////
        
            char RecvBuffer[1024];
        
            int  nRead = recv(sock, RecvBuffer, sizeof(RecvBuffer), 0);

            if( nRead > 0 )
            {
                // Empfang Ok, "nRead" enhält die Anzahl der empfangenen Bytes
            }
        
            closesocket(sock); // Verbindung abbauen
        }
    }       

    return 0; 
}
 
Zurück