C++: Server Anwendung schreiben?
Hallo,
Ich habe in C++ ein Programm indem es möglich sein soll sich mit einem Server zu verbinden. Der Server währe erstmals mein eigener PC. Ich wollte da erstmal mit einer Chatfunktion beginnen. Aber leider weiß ich nicht wie ich so eine Serveranwendung in C++ schreiben kann. Ich habe mir gedacht, dass ich der Server ungefähr so funktionieren soll:
string empfangende_daten=(Das was mir ein Client gesendet hat);
while(true) {
if(empfangende_daten.startswith("chat")){
//Jezt soll in dem Fenster der Clients die Chatnachicht stehen
//In diesem Beispiel hätte empfangende_daten den Wert: chat username324 'Nachicht die angezeigt wird'
}
}
Wie funktioniert so etwas? Wie kann ich das umsetzen? Und wenn ich das so mache wie oben im Beispiel dann würde das ja nicht funktionierten wenn zwei Leute gleichzeitig schreiben, oder?
LG
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.
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.
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.
Ich weiß dass das in Java anders geht, ich habe das nur geschrieben weil ich das auch in Java entwickeln könnte
Eine sehr gute Antwort. Was wäre eine Abstrahierung von IP/Transportschicht, bezogen auf C++-Programmierung?
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.
Danke für die Antwort! Welche Header muss ich dafür includen? Und ist das so richtig?: