Server erstellen mit client

R3LLiK

Grünschnabel
Für die Uni muss ich einen Server erstellen, worauf ein client zugriff hat.
Wir wurden einfach ins getummel rein geworfen und müssen uns das selbst beibringen.

Vielleicht wird das noch in der vorlesung drankommen aber die Zeit rennt.

Wie kann ich einen server erstellen unter unix (Linux).
 

cwriter

Erfahrenes Mitglied
Hi

Dazu wären ein paar mehr Informationen recht praktisch? C oder C++? Single-Client oder Multiclient?
Mit einer Bibliothek oder nativ (socket.h)?

TCP/UDP?

Was hast du schon, was fehlt dir noch?

Gruss
cwriter
 

R3LLiK

Grünschnabel
Hi

Dazu wären ein paar mehr Informationen recht praktisch? C oder C++? Single-Client oder Multiclient?
Mit einer Bibliothek oder nativ (socket.h)?

Was hast du schon, was fehlt dir noch?

Gruss
cwriter

Ja stimmt hab ich vergessen in C -> Single Client und Multiclient, aber dieser beitrag will ich erstmal den single client verstehen. Ja mit der Bibliothek.

Ich habe bisher den socket() aber hab das nicht ganz verstanden würde von neu anfangen.

wäre echt nett wenn man es mir erklären könnte.

Zu der Aufgabe: soll mich mit dem port verbinden 5678 und die ip adresse ausgeben lassen
 

cwriter

Erfahrenes Mitglied
Ich nehme dann mal TCP an.

Single-Client ist wesentlich einfacher als Multi-Client. Der Ablauf ist:
Socket erstellen (socket())
Socket an eine Adresse binden (bind())
Lesen (recv())
Antworten (send())

wenn fertig: close()

man socket, man bind, ... hilft :)

C:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char** argv[])
{
        int serversocket = socket(AF_INET, SOCK_STREAM, 0);
        assert(serversocket >= 0);
        struct sockaddr_in address;
        address.sin_family = AF_INET;
        address.sin_port = 1234;
        inet_pton(AF_INET, "127.0.0.1", &address.sin_addr.s_addr);      // Change when client is not on localhost
        int ret = bind(serversocket, (struct sockaddr*)&address, sizeof(address));
        assert(ret >= 0);
        char buf[512];
        memset(buf, 0, 512);
        while(strcmp(buf, "quit") != 0)
        {
                recv(serversocket, buf, sizeof(buf), 0);
                send(serversocket, "Message received", strlen("Message received"), 0);
        }
        close(serversocket);
        return 0;
}

Das mühsamste hier ist wohl das sockaddr_in, was ein bisschen hässlich ist...

Kriegst du damit einen Client hin?
Unterschiede sind klein, statt bind() verwendet man dann jeweils connect().
(Ist vielleicht nicht ganz alles perfekt, sollte aber etwa stimmen).

Was ist unklar?

Gruss
cwriter
 

cwriter

Erfahrenes Mitglied
wo haben wir den socket() erstellt??
?
socket() ist eine Funktion aus sys/socket.h. Ihr Rückgabewert ist ein Socket-Descriptor; den eigentlichen "socket" siehst du nie, nur dessen Nummer (die socket() zurückgibt). Aber das ist eigentlich ein Detail.
Wir speichern diese Nummer in 'serversocket'.

Gruss
cwriter
 

cwriter

Erfahrenes Mitglied
Whoops, sorry, mein Fehler. Zuviel UDP in letzter Zeit...
C:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char** argv[])
{
        int serversocket = socket(AF_INET, SOCK_STREAM, 0);
        int ret;
        assert(serversocket >= 0);
        struct sockaddr_in address;
        address.sin_family = AF_INET;
        address.sin_port = 5555;
        address.sin_addr.s_addr = INADDR_ANY;  // jedes interface
        //ret = inet_pton(AF_INET, "127.0.0.1", &address.sin_addr); // Nur localhost
        //assert(ret == 1);
        ret = bind(serversocket, (struct sockaddr*)&address, sizeof(address));
        assert(ret >= 0);
        listen(serversocket, 1);
        int msgsocket = accept(serversocket, 0, 0);
        char buf[512];
        memset(buf, 0, 512);
        while(strcmp(buf, "quit") != 0)
        {
                ret = recv(msgsocket, buf, sizeof(buf), 0);
                if(buf[0] != 0)
                        printf("received: %s\n", buf);
                send(msgsocket, "Message received", strlen("Message received"), 0);
        }
        close(msgsocket);
        close(serversocket);
        return 0;
}

So müsste der Server aussehen...
Zum Ablauf:
socket() erstellt den listening-Socket (der Verbindungen annimmt)
bind() bindet diesen Socket an die Listen-Addresse
listen() wartet auf Verbindungen
accept() erstellt einen neuen Socket (für diese Verbindung, könnte ja mehrere geben).
Und dann muss von diesem Socket gelesen werden...
(Der Client ist aber wirklich einfacher :) )

Gruss
cwriter