Zum Inhalt springen

Netzwerkprogrammierung Verbinde Client zu Client


Empfohlene Beiträge

Geschrieben

Hallo,

Ich will in meinem Programm einen Clienten (meinen Rechner) mit einem anderem verbinden.

Ich will also am ende einen Clienten an der Leine haben.

könnt ihr mahl die Logischen schritte Posten

Danke

Geschrieben

Das kommt darauf an, was du unter client/client verbindung verstehst. i.d.R. sind peer to peer verbindungen so aufgebaut, das beide gleichzeitig client und server sind. Ein server hört und wartet auf eine Verbindung. Ein Client verbindet sich und sorgt für einen verbindungsaufbau. Sobald diese Verbindung aufgebaut ist, können server und client sich ganz normal "unterhalten".

Wenn du jetzt also einen Client haben willst, der sich zu einem anderen Client verbinden will, und umgekehrt, müssen also beide hören, und sich verbinden können. Also Client und Server.

Bei verbindungen zwischen clients über einem Server muß dieser Server halt die Nachrichtenpakete zwischen den zu ihm verbundenen Clients "vermitteln" können.

Kannst du einen Anwendungsfall nennen? Dafür lassen sich besser Lösungswege erstellen.

;)

Geschrieben

Ein Ping Zum Beispiel.

Netzwerkstrucktur: Ich arbeite an einem Clienten der als Hauptbenutzer an einer Domain angemeldet ist.

Ich will mich mit einem anderen verbinden der im Prinzip die gleiche stellung hat wie mein rechner.

wie ein Ping (von meinem Rechner suche ich einen anderen, aber keinen Server.)

Die Serververbindung kriege ich hin. Jetzt weis ich folgendes nicht.

muß ich einen Socket erstellen dann eine Verbindung zum Server erstellen (soweit gehts) und dann muß ich ja quasi vom Server runter zu dem rechner den ich erreichen will. (wieder mit connect ?)

Geschrieben

Wenn es um Netzwerkprogrammierung geht, haben die Begriffe "Client" und "Server" nichts mit der Netzwerkstruktur zu tun. Den Client nennt man den Computer bzw. das Programm, das die Verbindung aufbaut. Der Server ist der, der sie entgegennimmt.

Du kannst Dich daher per Definition nicht mit einem "Client" verbinden.

Es gibt, wie Net-srac schon geschrieben hat, zwei Möglichkeiten:

1.

Dein Programm ist zugleich Server und Client. Jeder Rechner, auf dem das Programm läuft, kann sich mit jedem anderen Rechner, auf dem das Programm läuft, verbinden.

2.

Es gibt einen Vermittlungsserver, der die Anfragen der Clients weiterleitet. Aber auch dann verbindet sich immer nur der Client mit dem Server. Der Server kann also nichts an einen anderen Client weiterleiten, wenn der sich vorher nicht mit dem Server verbunden hat.

Mischformen sind auch möglich. Dein Ping-Beispiel fällt übrigens in die erste Kategorie, auch wenn man dabei nicht unbedingt von "Server" spricht.

Originally posted by ComputNik

Die Serververbindung kriege ich hin.

Ist das ein bereits bestehender Dienst, oder hast du die Serverkomponente selbst geschrieben?
Geschrieben
Originally posted by Klotzkopp

Mischformen sind auch möglich. Dein Ping-Beispiel fällt übrigens in die erste Kategorie, auch wenn man dabei nicht unbedingt von "Server" spricht.

Ping ist in jedem Fall eine Sonderform, da es sich um ein eigenes Protokoll handelt (ICMP, Typ 1). ICMP-Requests werden direkt vom Protokollstack auf der Zielmaschine behandelt. Im Gegensatz dazu stehen UDP und TCP (Typ 17 bzw. Typ 6) die für den Endnutzer gedacht sind und die zur Adressierung notwendigen Portnummern mitbringen.

Ein einfaches Beispiel für eine Server/Client Kommunikation findest Du beispielsweise hier: http://www.pcs.cnu.edu/~dgame/sockets/sockets.html

Nic

Geschrieben
Originally posted by ComputNik

wie ein Ping (von meinem Rechner suche ich einen anderen, aber keinen Server.)

Die Serververbindung kriege ich hin. Jetzt weis ich folgendes nicht.

Was hast du eigentlich vor zu bauen?! Willst du Rechner suchen, oder eine Verbindung zu ihnen Testen? Zumindest hört es sich so an...

Geschrieben

Ich will eine art Chat Programm schreiben.

Das heist zwei rechner miteinander verbinden und dan Daten hin und her schieben.

So wie ich das jetzt verstanden habe muß sich rechner 1 mit dem Server verbinden und rechner 2 ebenfalls. Rechner 1 und 2 sind Clienten == eine verbindung aufbauen. Der Server warte auf diese Verbindung und nimmt sie entgegen.

Also auf beiden Rechnern das gleiche Programm. Das Programm ertellt einen Socket und erstellt eine Verbindung zu einem Server über irgend- einen Port (Port ? == welchen nehme ich den da) So jetzt sind die verbindungen zum Server hergestellt. Wie sage ich aber jetzt dem Programm oder dem Server das diese Verbindungen die aufgebaut sind zueinander gehören?

Geschrieben

Auf beiden Rechnern laeuft ClientServer.c Das ganze sollte so programmiert werden, das beide Systeme sowohl Client als auch Server Funktionalität zur Verfügung stellen (da Du normalerweise nicht weisst, wer den Verbindungsaufbau initiiert).

Nic

Geschrieben

Code:

#include <stdio.h>

#include <io.h>

#include <winsock.h>

#include <errno.h>

#include <string.h>

#define PORT 80

#define HOST "w2kserver"

#define DIRSIZE 8192

main(argc, argv)

int argc; char **argv;

{

char hostname[100];

char dir[DIRSIZE];

int sd;

struct sockaddr_in sin;

struct sockaddr_in pin;

struct hostent *hp;

// initialisiere Winsock

WSADATA wsaData;

if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0)

{

printf ("kann winsock nicht initialisieren.\n");

exit (EXIT_FAILURE);

}

printf("Initialisierung von Winsock war erfolgreich.\n");

strcpy(hostname,HOST);

if (argc>2)

{ strcpy(hostname,argv[2]); }

printf("strcpy war erfolgreich\n");

/* go find out about the desired host machine */

if ((hp = gethostbyname(hostname)) == 0) {

perror("gethostbyname");

exit(1);

}

printf("go find out about the desired host machine\n");

/* fill in the socket structure with host information */

memset(&pin, 0, sizeof(pin));

pin.sin_family = AF_INET;

pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;

pin.sin_port = htons(PORT);

printf("fill in the socket structure with host information\n");

/* grab an Internet domain socket */

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

printf("socket Funktion erfolgreich\n");

/* connect to PORT on HOST */

if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) {

perror("connect()");

exit(1);

}

printf("connect Funktion erfolgreich\n");

/* send a message to the server PORT on machine HOST */

if (send(sd, argv[1], strlen(argv[1]), 0) == -1) {

perror("send");

exit(1);

}

printf("send message ergab keinen fehler");

/* wait for a message to come back from the server */

if (recv(sd, dir, DIRSIZE, 0) == -1) {

perror("recv");

exit(1);

}

/* spew-out the results and bail out of here! */

printf("%s\n", dir);

close(sd);

}

//#############################

//als Quelle habe ich den Code aus dem obrigen Link benutzt.

nach jedem abschnitt habe ich eine Textausgabe geschrieben um zu überprüfen an welcher stelle ein fehler auftritt:

Bis zur Funktion send() funktioniert alles.

die funktion recv() die überprüft ob alles angekommen ist wird nie beendet.

warum nicht?

Geschrieben

Wie sieht der dazugehörige Servercode aus? Oder sendest Du einfach etwas an einen Webserver?

recv wird erst dann zurückkommen, wenn der Server die vollen 8192 Bytes, die Du haben willst, gesendet hat.

Eine Anmerkung zum Stil: Anstelle der Defines solltest Du besser Konstanten verwenden, in etwa so:

const unsigned short PORT = 80;

const char* HOST = "w2kserver";

const int DIRSIZE = 8192;

Geschrieben

Ich habe mich mit einem Webserver versucht zu verbinden. Gestern hat es nicht funktioniert heute mit gleichem code schon, keine ahnung warum es nicht funktioniert hat.

Versuche es jetzt mal auf meinem Zweitrechner ein Server.c laufen zu lassen und auf meinem ein client.c

Geschrieben

code für server.c

#include <stdio.h>

#include <io.h>

#include <winsock.h>

#include <errno.h>

#include <string.h>

#define PORT 80

#define DIRSIZE 8192

main()

{

char dir[DIRSIZE];

int sd, sd_current, cc, fromlen, tolen;

int addrlen;

struct sockaddr_in sin;

struct sockaddr_in pin;

// initialisiere Winsock

WSADATA wsaData;

if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0)

{

printf ("kann winsock nicht initialisieren.\n");

exit (EXIT_FAILURE);

}

printf("Initialisierung von Winsock war erfolgreich.\n");

/* get an internet domain socket */

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

printf("Socket erstellen ergab keinen fehler.\n");

/* complete the socket structure */

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET;

sin.sin_addr.s_addr = INADDR_ANY;

sin.sin_port = htons(PORT);

printf("complete the socket structure.\n");

/* bind the socket to the port number */

if (bind(sd, (struct sockaddr *) &sin, sizeof(sin)) == -1) {

perror("bind");

exit(1);

}

printf("bind ergab keinen fehler.\n");

/* show that we are willing to listen */

if (listen(sd, 5) == -1) {

perror("listen");

exit(1);

}

printf("listen ergab keinen fehler.\n");

/* wait for a client to talk to us */

addrlen = sizeof (pin);

if ((sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen)) == -1)

{

perror("accept");

exit(1);

}

printf("wait for client to takl to us.\n");

/* get a message from the client */

if (recv(sd_current, dir, sizeof(dir), 0) == -1) {

perror("recv");

exit(1);

}

printf("recv ergab keinen fehler.\n");

// read_dir (dir);

/* strcat (dir," DUDE");*/

/* acknowledge the message, reply w/ the file names */

if (send(sd_current, dir, strlen(dir), 0) == -1) {

perror("send");

exit(1);

}

/* close up both sockets */

close(sd_current); close(sd);

return 0;

}

Ich bin jetzt erst mal so weit das keine fehler kommen.

allerdings kommen bei server.c keine nachrichten von client.c an.

Ich habe allerdings keine ahnung woran das liegt.

Geschrieben
Originally posted by ComputNik

Ich bin jetzt erst mal so weit das keine fehler kommen.

allerdings kommen bei server.c keine nachrichten von client.c an.

Ich habe allerdings keine ahnung woran das liegt.

Das gleiche wie oben: Du gibst bei recv an, dass 8192 Bytes gelesen werden sollen (sizeof(dir)). Ich weiß nicht, was Du beim Client als Kommandozeilenparameter angibst, aber so viel wird's wohl nicht sein. recv kommt aber, wie schon gesagt, erst zurück, wenn alle angeforderten Bytes empfangen wurden.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...