C++: Server Anwendung schreiben?


29.04.2021, 10:02

Ergänzung: Falls jemand weiß wie das in Java geht, kann er das auch schreiben.

2 Antworten

Hier ist ein minimalistisches Beispiel für einen TCP-Server.

Deklarationen:

int                iStat,iSock,iSock2;
struct sockaddr_in xSock;
socklen_t          iSockLen;

einen TCP-Protkollport erzeugen:

AF_INET steht für TCP/IP mit 4-Byte-IP-Adressen, PORT ist die Portnummer, zu der der Client sich verbinden muss.

memset(&xSock,0,sizeof(xSock));
xSock.sin_family      = AF_INET;
xSock.sin_port        = htons(PORT);

// SOCK_STREAM steht für TCP
iSock = socket(PF_INET,SOCK_STREAM,0);
if(iSock<0) Abort("socket() failed");

iStat = bind(iSock,(sockaddr *)&xSock,sizeof(xSock));
if(iSock<0) Abort("bind() failed");

iStat = listen(iSock,5);
if(iStat) Abort("listen() failed");

Jetzt können sich Clients mit dem Port verbinden.

for(;;) {

Wir warten, bis sich jemand verbindet.

    iSockLen = sizeof(xSock);
    iSock2   = accept(iSock,(sockaddr *)&xSock,&iSockLen);
    if(iSock2<0) Abort("accept() failed");

iSock2 ist der Kommunikationsport, der Protokollport iSock ist frei für die nächste Verbindung.

Wenn man jetzt nicht Multitasking oder Multithreading macht, muss der nächste Client aber warten, bis wieder accept() gerufen wird. Die 5 bei listen() gibt an, wieviele Clients gleichzeitig warten können.

// Hier kann man mit send() und recv() über iSock2
// mit dem Client kommunizieren.

Kommunikationsport zumachen und auf den nächsten Client warten

    close(iSock2);
  }

Wenn das unter Linux laufen soll, ist der Internet-Dämon (inetd) eine große Hilfe, denn der organisiert schon mal den Protokollport und das Multitasking.

name123454321 
Fragesteller
 29.04.2021, 11:38

Danke für die Antwort! Welche Header muss ich dafür includen? Und ist das so richtig?:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PORT 8080


int                iStat,iSock,iSock2;
struct sockaddr_in xSock;
socklen_t          iSockLen;


int main() {
    memset(&xSock,0,sizeof(xSock));
    xSock.sin_family      = AF_INET;
    xSock.sin_port        = htons(PORT);


    // SOCK_STREAM steht für TCP
    iSock = socket(PF_INET,SOCK_STREAM,0);
    if(iSock<0) Abort("socket() failed");


    iStat = bind(iSock,(sockaddr *)&xSock,sizeof(xSock));
    if(iSock<0) Abort("bind() failed");


    iStat = listen(iSock,5);
    if(iStat) Abort("listen() failed");


    for(;;) {
        iSockLen = sizeof(xSock);
        iSock2   = accept(iSock,(sockaddr *)&xSock,&iSockLen);
        if(iSock2<0) Abort("accept() failed");
        close(iSock2);
    }
}
0
tunik123  29.04.2021, 12:01
@name123454321

Zumindest für Linux

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

oder für Windows

#include <winsock2.h>

Bei Windows muss man das Socket-Wesen erst initialisieren

WSADATA wsaData;
if(WSAStartup(0x0202,&wsaData)!=0) -> Fehler
if(wsaData.wVersion!=0x0202)  -> Fehler

(Für die Abort-Funktion musst Du auch noch etwas ausdenken.)

Vor close(iSock2) sollte man mit dem Client kommunizieren.

0

Normalerweise - wenn man es ganz "zu Fuß" macht - über TCP oder UDP Sockets. Google mal nach "C++ TCP Server Socket" - das sollte entsprechende Infos aufzeigen. Du kannst auch fertige Libraries verwenden, die andere Protokolle implementieren.

Zur Ergänzung Ergänzung: Falls jemand weiß wie das in Java geht, kann er das auch schreiben.

Diese Information dürfte für Dich von wenig oder höchstens "konzeptionellem" Nutzen sein, da Java durch sein Framework hier komplett andere Wege geht. Das geht in C++ anders als in Java.

wunschname0302  29.04.2021, 10:04

Eine sehr gute Antwort. Was wäre eine Abstrahierung von IP/Transportschicht, bezogen auf C++-Programmierung?

0
ohwehohach  29.04.2021, 10:09
@wunschname0302

Wenn Du meinst, auf welche Libraries ich anspiele: Hier gibt's ja beispielsweise mit XMPP offene Protokolle, die die Kommunikation zwischen Client und Server regeln. Natürlich basieren im Endeffekt alle auf TCP/UDP, aber beispielsweise Verschlüsselung, Zustellgarantie, etc. wird dadurch nicht zwangsläufig gewährleistet.

0
ntech  29.04.2021, 10:13

Besser kann man es nicht erklären!

0
name123454321 
Fragesteller
 29.04.2021, 10:27

Ich weiß dass das in Java anders geht, ich habe das nur geschrieben weil ich das auch in Java entwickeln könnte

0