Client/Server Projekt

Hi an alle !

Hier kommt ein kleines C/S (nein..kein CStrike und auch kein CyberSex) Projekt...

Der Server ist ein kleines Programm das mit 2 Parametern aufgerufen wird....

server <portnummer> <datei>

Portnummer ist der POrt auf dem der Server auf Anfragen horchen soll..
Datei ist das file welches an den Client (der connected) uebergeben wird..

Der client wird gestartet:
client <host> <port>

host ist die IP Adresse ( die gethostbyname Funktion kommt..ist aber vorerst nicht so wichtig) des Servers

Port ist auch hier der POrt wo connected werden soll..

Das Ding hab ich unter Linux geschrieben...
und mit dem GNU compiler kompiliert....

Wenn einer den Client nach Windows portieren koennte waere das super ..

Der code ist keinesfalls sicher..d.h. auch anfaellig fuer einen buffer overflow..kann man aber sicher machen..

Ziel soll es sein das ganze als eine Art file transfer tool salonfaehig zu machen...oder als eine art chat/mail tool...

wobei dem dem folgenden codes nur eine connection bearbeitet wird, das der Server (nach verrichteter Arbeit beendet wird), dh man muss noch mit fork an die Sache rangehen...

ich wuerde mich ueber statements hier im Forum freuen..auch sollten Vorschlaege (mit code) gepostet werden...

thx

#######################################
Hier der Server:



// server.c

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>

#define MAXCON 1024
#define BUFFER_SIZE 1024
#define LANG 1024

int main(int argc, char* argv[])
{
char buffer[BUFFER_SIZE], name[BUFFER_SIZE];
char *array = NULL;
int i = 1;
int sock, c, b;
int a_deskript;
int client_size;
FILE *dat_zeiger;

struct sockaddr_in server, client;

if (argc != 3)
{
printf("\nSYNTAX: server <port-nummer> <datei>\n");
return 1;
}

server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons((unsigned short int) atol (argv[1]));
server.sin_family = AF_INET;

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
perror("\nSOCKET FAILED");
return 1;
}
else
{
printf("\nSOCKET done\n");
}

if (b = bind(sock, &server, sizeof(server)) == -1)
{
perror("\nBIND FAILED");
return 1;
}
else
{
printf("\nBIND done");
}

if (listen(sock,MAXCON)== -1)
{
perror("\nLISTEN FAILED");
return 1;
}
else
{
printf("\nLISTEN done");
}

for ( ; ; )
{
client_size = sizeof(client);
a_deskript = (accept(sock, &client, &client_size));
if (a_deskript == -1)
{
perror("\nACCEPT FAILED");
return 1;
}
else
{
printf("\nACCEPT done");
}
printf("\nclient von %s\n", inet_ntoa(client.sin_addr));
dat_zeiger = fopen(argv[2],"r");
array=(char*)malloc(sizeof(char));
while((array[i-1]=getc(dat_zeiger))!=EOF)
{
i++;
array=(char*)realloc(array,sizeof(char)*i);
}
fclose(dat_zeiger);
array[i-1]='\0';
// printf("%s",array); hier kann der Server zum test das file an
// der shell ausgeben
free(array);
send(a_deskript, array, strlen(array),0);
}
close(sock);
return 1;
}


###############################################
Und hier der Client:

// client.c

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUFFER_SIZE 8024

int main(int argc, char* argv[])
{
char buffer[BUFFER_SIZE];
char tempo[8024];
int bytes;
int sock, a, b;

struct sockaddr_in server;

if (argc!=3)
{
perror("\nSYNTAX: client <host-ip> <port>");
return 1;
}

server.sin_addr.s_addr = inet_addr(argv[1]);
server.sin_port = htons((unsigned short int)atol(argv[2]));
server.sin_family = AF_INET;

sock = socket(AF_INET, SOCK_STREAM,0);
if(sock == -1)
{
perror("\nSOCKET FAILED");
return 1;
}

if (connect(sock, &server, sizeof(server)) == -1)
{
perror("\nCONNECT FAILED");
return 1;
}

bytes = recv(sock, buffer, sizeof(buffer),0);
b = 0;
a = 0;
if (bytes == -1)
{
perror("\nRECV FAILED");
return 1;
}
buffer[bytes] = '\0';
while (buffer!='\0')
{
tempo[a]=buffer;
a++;b++;
}
puts(tempo);
}
 
Ich code das gleiche wie Du auch. Allerdings in Java. Zur Zeit schreibe ich gerade das GUI für den Clienten, weil das als Konsolenanwendung echt unübersichtlich wird.

Original von seth
wobei dem dem folgenden codes nur eine connection bearbeitet wird, das der Server (nach verrichteter Arbeit beendet wird), dh man muss noch mit fork an die Sache rangehen...

Hmm, das muss man wohl so verstehen, das der Server nur eine Verbindung halten kann, richtig? Und nach verrichteter Arbeit willst Du die Verbindung zum Client beenden und nicht den ganzen Server, oder?

Gruß ZJ!
 
ich will nicht das er sie beendet..nur ist er so progarmmiert dass er es halt macht..
..
und zur Konsole.::.Ja da hast Du Recht..aber was visualisierung unter Linux/Unix angeht bin ich nicht noch firm..

:wq!
 
Hmm, ich dachte Du willst den Client sowieso nach Windows portieren. Und mit Java wärs sowieso kein Problem, da die Swing-Controls ja rein theoretisch überall gleich aussehen. (Merkt man eigentlich, dass ich auf Java stehe :D)

Gruß ZJ
 
Original von zerojump
Hmm, ich dachte Du willst den Client sowieso nach Windows portieren. Und mit Java wärs sowieso kein Problem, da die Swing-Controls ja rein theoretisch überall gleich aussehen.

Schreibst du zu erst die GUI oder erst den "ausführenden Code" ? Würde mich mal näher interessieren wie du da vorgehst, progge auch in Java (eigentlich nur Proggs die in der Konsole ausgeführt werden) hab aber noch nicht den Durchblick wie ich das mit der GUI anstellen soll. Vielleicht könntest du mir etwas weiterhelfen.

mfg., Odin
 
Ich habe zuerst den Server geschrieben. Der läuft als reine Konsolenapplikation. Dann kam der Client dran in der Rohform. Am Anfang hat der auch erst mal nur als Konsolenapplikation gearbeitet, die grundlegenden Aufgaben konnte der ja trotzdem erfüllen, z.B. eine Datei vom Server laden.

Das GUI bastel ich jetzt erst drumrum. Ich schreibe dafür extra neuen Code und kombiniere ihn dann mit der Funktionalität des alten Clienten.

Gruß ZJ
 
@zerojump

bei mir zuhause laeuft der Server als daemon ..der wiederum von einem script gestartet wird...das script schaut nach, ob bestimmte logs existieren und wenn ja..dann startet der Server halt...

auf dem anderen Rechner laeuft der Client; wird auch in best. Abstaenden gestartet und empfaent die Datei..
...

:wq!
 
Zurück
Oben