Salve ragazzi ho creato questa connessione client server in tcp,l'obbiettivo e che il server nn si deve mai fermare e puo connettersi contemporaneamente a tre client,il mio ha il problema che dopo che il client si collega e gli manda l'operazione da svolgere,compie l'operazione e termina il suo lavoro cosa nn richiesta,in quanto nn deve mai fermarsi....vi posto il codice sia del client che
SERVER
#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
#define WIN32_LEAN_AND_MEAN
#define PATHNAME1 "C:\\client\\dir"
#define PATHNAME2 "C:\\eclipse\\dir"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dirent.h>
#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1"
#define QLEN 3
typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0
void errorHandler(string);
void clearWinSock();
void initWinSock();
int main(int argc, char *argv[]) {
struct operazione{
char * decisione;
char * prima;
char seconda[1000];
char mes [300] ;
}dati;
int port_server;
if (argc > 1) {
port_server = atoi(argv[1]);
} else
port_server = PORT;
if (port_server < 0) {
printf("bad port number %s \n", argv[1]);
return 0;
}
initWinSock();
//CREAZIONE DELLA SOCKET
int mySocket;
mySocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mySocket < 0) {
errorHandler("socket creation failed. \n");
clearWinSock();
return 0;
}
// ASSEGNAZIONE DI UN INDIRIZZO ALLA SOCKET
struct sockaddr_in sad;
memset(&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr = inet_addr("127.0.0.1");
sad.sin_port = htons(port_server);
if (bind(mySocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) {
errorHandler("bind() failed.\n");
closesocket(mySocket);
clearWinSock();
return 0;
}
// SETTAGGIO DELLA SOCKET ALL'ASCOLTO
if (listen(mySocket, QLEN) < 0) {
errorHandler("listen() failed.\n");
closesocket(mySocket);
clearWinSock();
return 0;
}
// ACCETTARE UNA NUOVA CONNESSIONE
struct sockaddr_in cad; // structure for the client address
int clientSocket; // socket descriptor for the client
unsigned int clientLen; // the size of the client address
printf("[INFO] Waiting for a client to connect...\n");
fflush(stdout);
while (1) {
clientLen = sizeof(cad); // set the size of the client address
if ((clientSocket = accept(mySocket, (struct sockaddr *) &cad,
&clientLen)) < 0) {
errorHandler("accept() failed. \n");
// CHIUSURA DELLA CONNESSIONE
closesocket(mySocket);
clearWinSock();
return 0;
}
printf("[INFO] Connesso al client %s:%d\n", inet_ntoa(cad.sin_addr),
cad.sin_port);
//Ricevo i dati dal client
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
if(dati.decisione=='c')
{
FILE *f;
if((f=fopen("file.txt","w")) == NULL){
printf("impossibile aprire file\n");}
fputs(dati.seconda,f);
fclose (f);
strncpy(dati.mes,"upload avvenuto",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
}
else
if(dati.decisione=='u'){
FILE *input,*output;
if((input=fopen("file.txt","r"))==NULL)
printf("Il file non puo' essere aperto");
else if((output=fopen("C:\\savedir\\file.txt","w"))==NULL)
printf("Il file non puo' essere aperto");
else{
int ch;
ch = fgetc(input);
while (!feof(input)) {
fputc(ch,output);
ch = fgetc(input);
}
}
fclose(input);
fclose(output);
strncpy(dati.mes,"dowloand avvenuto",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
}
else
if(dati.decisione=='l'){
DIR *dp;
struct dirent *dir_p;
dp = opendir("C:\\client\\");
if ( dp == NULL )
exit(1);
while( ( dir_p = readdir(dp) ) != NULL )
printf("%s\n", dir_p -> d_name);
strncpy(dati.mes,"elenco effettuato sul output server",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
closedir(dp);
system("pause");
return 0;
}
else
if(dati.decisione=='f'){
DIR *dp;
struct dirent *dir_p;
dp = opendir("C:\\eclipse\\");
if ( dp == NULL )
exit(1);
while( ( dir_p = readdir(dp) ) != NULL )
printf("%s\n", dir_p -> d_name);
strncpy(dati.mes,"elenco effettuato sul output server",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
closedir(dp);
system("pause");
return 0;
} else
if(dati.decisione=='n'){
LPCSTR lpcPathname = PATHNAME1;
if (!(CreateDirectory(lpcPathname,NULL))) {
MessageBox(NULL,"CreateDirectory ha fallito","Errore",MB_ICONERROR | MB_OK);
return -1;
}
strncpy(dati.mes,"cartella creata...\n",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
}
else
if(dati.decisione=='m'){
LPCSTR lpcPathname = PATHNAME2;
if (!(CreateDirectory(lpcPathname,NULL))) {
MessageBox(NULL,"CreateDirectory ha fallito","Errore",MB_ICONERROR | MB_OK);
return -1;
}
strncpy(dati.mes,"cartella creata...\n",300);
printf("esito operazione: %s\n",&dati.mes);
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
}
}
}
void errorHandler(string errorMessage) {
printf("[ERROR] %s", errorMessage);
}
void clearWinSock() {
#if defined WIN32
WSACleanup();
#endif
}
//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
errorHandler("Error at WSAStartup()\n");
exit(0);
}
#endif
}
CLIENT
#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0
#define IP_SIZE 16 //lunghezza massima della stringa IP
#define PORT_SIZE 7 //lunghezza massima della stringa IP
#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1" // Indirizzo di default
void errorHandler(string);
void clearWinSock();
void initWinSock();
int main(void) {
struct operazione{
char * decisione;
char * prima;
char seconda[1000];
char mes[300];
}dati;
initWinSock();
// CREAZIONE DELLA SOCKET
int clientSocket;
while(dati.decisione!='q'){
clientSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket < 0) {
errorHandler("socket creation failed.\n");
clearWinSock();
return 0;
}
int port_server;
string ip_server = (string) malloc(IP_SIZE);
string port = (string) malloc(PORT_SIZE);
printf("Inserisci l'indirizzo ip del server...(127.0.0.1 di default) ");
fgets(ip_server, IP_SIZE, stdin);
printf("Inserisci il numero di porta del server...(45890 di default) ");
fgets(port, PORT_SIZE, stdin);
if (strcmp(ip_server, "\n") == 0)
ip_server = IP;
else
ip_server[strlen(ip_server) - 1] = '\0';
if (strcmp(port, "\n") == 0)
port_server = PORT;
else {
port[strlen(port) - 1] = '\0';
port_server = atoi(port);
}
// COSTRUZIONE DELL’INDIRIZZO DEL SERVER
struct sockaddr_in sad;
memset(&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr = inet_addr(IP); // IP del server
sad.sin_port = htons(port_server); // Server port
// CONNESSIONE AL SERVER
if (connect(clientSocket, (struct sockaddr *) &sad, sizeof(sad)) < 0) {
errorHandler("Failed to connect.\n");
printf("ERRORE NUMERO %d", errno);
closesocket(clientSocket);
clearWinSock();
return 0;
}
printf("[INFO] Connessione avvenuta\n");
system("cls");
dati.decisione='a';
printf("menu\n_________________________________________________\n");
printf(" c (effettua l'upload sul server del file file.ext)\n"
" u(effettua il download del file file.ext dal server nella cartella savedir)\n"
" l (elenca i file e le cartelle contenuti nella cartella locale del client)\n"
" f (elenca il file nella cartella remota del server)\n"
" n (crea cartella dir nella cartella locale del client\n"
" p (crea cartella dir nella cartella remota del server\n"
" q (il client si disconnette)\n");
printf("Scegli l'operazione:\n");
scanf("%s",&dati.decisione);
if(dati.decisione =='c')
{
printf("viene fatto l'upload del file di nome file.txt presente \n nella cartella client in C\n");
dati.prima = 'file.txt';
// printf("seconda parola ricevuta: %s\n",&dati.prima);
FILE *f;
if((f=fopen("C:\\client\\file.txt","r")) == NULL){
printf("impossibile aprire file\n");
}
char c;
int i = 0;
c=fgetc(f);
while (c!=EOF){dati.seconda[i]=c;
c=fgetc(f);
i++;
}
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
else
if(dati.decisione=='u'){
printf("viene fatto dowload del file di nome file.txt presente \n nella cartella del server"
"in una cartella savedir \n");
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
else
if(dati.decisione=='l'){
printf("elenca i file presenti nella cartella locale del client\n");
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
else
if(dati.decisione=='f'){
printf("elenca i file presenti nella cartella remota del server\n");
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
else
if(dati.decisione=='n'){
printf("crea cartella dir nella cartella locale del client\n");
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
else
if(dati.decisione=='m'){
printf("crea cartella dir nella cartella remota del server\n");
send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
printf("esito operazione : %s\n",&dati.mes);
}
}
printf("[INFO] Connessione chiusa\n");
// CHIUSURA DELLA CONNESSIONE
closesocket(clientSocket);
clearWinSock();
return (0);
}
void errorHandler(string errorMessage) {
printf("%s", errorMessage);
}
void clearWinSock() {
#if defined WIN32
WSACleanup();
#endif
}
//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
errorHandler("Error at WSAStartup()\n");
exit(0);
}
#endif
}