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);
}
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);
}