PDA

View Full Version : [c] comunicazione fra client e server


mamo139
29-11-2007, 21:28
è da quasi un anno e mezzo che non programmo in c e quindi sono un po arrugginito, e in piu visto che ho solo usato il php in sto periodo m sto pure incasinando con i tipi di variabili


ora ho un server e un client (che avevo scritto con tanto sudore un bel po di tempo fa), e funzionano che il client manda al server un messggio e il server lo fa vedere...
ora mi piacerebbe rispolverarlo e fare in modo che ogni carattere inserito vada direttamente a visualizzarsi sul server, insomma come una specie di telnet per intenderci... sapreste aiutarmi con qualche dritta? grazie mille

CLIENT

#include <windows.h>
#include <winsock.h> //includo le varie librerie tra cui quella winsock
#include <stdio.h>

int main(int argn,char **argv)
{

int err = 0;

SOCKET sock; // creo la socket chiamato sock che userò nella connessione
struct sockaddr_in sock_addr; // inizializzo la socket
WSADATA data; // inizializzo la variabile che contiene le primitive di Winsock
WORD p;
p=MAKEWORD(2,0); // creo la variabile p che contiene la versione della wsock32.dll

char messaggio[2000];
int errori = 0;


err = WSAStartup(p,&data); // inizializzo la wsock32.dll verificandone la mancanza di errori



sock=socket(PF_INET,SOCK_STREAM,0); // creo la socket indicandone le caratteristiche
sock_addr.sin_family=PF_INET; // indico il protocollo utilizzato (TCP/IP)
sock_addr.sin_port=htons(1234); //indico la porta a cui connettere la socket
sock_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico l'indirizzo IP
sock_addr.sin_addr.S_un.S_un_b.s_b2=0;
sock_addr.sin_addr.S_un.S_un_b.s_b3=0;
sock_addr.sin_addr.S_un.S_un_b.s_b4=1;

err = connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr)); // mi connetto all'indirizzo scelto



char mex[2000];
recv(sock,mex,2000,0);

printf("FROM server: %s",mex);

for (int x=0;;x++){
//*********************dialogo***********************//

printf("commands> ");
gets(messaggio);
if (messaggio[0] == 'e' && messaggio[1] == 'x' && messaggio[2] == 'i' && messaggio[3] == 't') break;

errori = send(sock,messaggio,2000,0);

if (errori == 2000){
printf("2000 comando: %s\n",messaggio);
}else { printf("errore send() %d\n" ,errori); }

}

closesocket(sock); // chiudo la socket
WSACleanup(); //libero le risorse utilizzate dalla libreria Winsock

//end for


printf("\n\n%d\n",err);


return 0;
}


SERVER:

#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <string.h>
#define MAX_STRING 256

int main(int argn,char **argv){
SOCKET miosock,client;
struct sockaddr_in miosock_addr,client_addr;
WSADATA data;
WORD p;
int len(char *);
int lun, err=0;
char mex[]="SERVER attivo: in attesa di messaggi!!!\n";
p=MAKEWORD(2,0);

loading:

err=WSAStartup(p,&data);


miosock=socket(PF_INET,SOCK_STREAM,0);
miosock_addr.sin_family=PF_INET;
miosock_addr.sin_port=htons(atoi("1111"));
miosock_addr.sin_addr.s_addr=INADDR_ANY;
err=bind(miosock,(struct sockaddr*)&miosock_addr,sizeof(struct sockaddr_in));
err=listen(miosock,1);
lun=sizeof (struct sockaddr);
client=accept(miosock,(struct sockaddr*)&client_addr,&lun);
if (err!=0) printf ("Errore connessione");

//**************dialogo***************/
send(client,mex,sizeof(mex),0);

int recverr = 0;
for(;;){
char mex2[2000];
recverr = recv(client,mex2,2000,0);
printf("recv: %d\n",recverr);

if (recverr != 2000){ break; }else{
printf("%s\n",mex2);
}

//comandi:

if (strncmp(mex2, "restart", 7) == 0){
printf("comando %s riconosciuto!",mex2);
closesocket (client); closesocket(miosock); WSACleanup(); goto loading;
}
else if (strncmp(mex2, "stop", 4) == 0)
{ break; }
else { printf("comando sconosciuto: %s\n\n",mex2); }

}//chiusura for
closesocket (client);
closesocket(miosock);
WSACleanup();

//end
system("pause");
return 0;
}

mamo139
30-11-2007, 19:15
nessuno?? magari anche sl un aiutino con il server che poi lo uso con telnet

tglman
30-11-2007, 20:05
teoricamente puoi cambiare esclusivamente il client ...
intanto il server stampa tutto quello che gli manda il client ;)

semplicemente basta che sostituisci la chiamata gets che restituisce il controllo solo dopo l'invio con una del tipo scanf o fgets che legge un carattere solo, modificanto anche le piccole gestioni di confronto ... buona fortuna ;)

mamo139
30-11-2007, 20:49
il server l'ho riadattato così e ora con telnet va alla perfezione... ora provo a vedere cosa tiro fuori dal client :)


#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <string.h>
#define MAX_STRING 256

int main(int argn,char **argv){
SOCKET miosock,client;
struct sockaddr_in miosock_addr,client_addr;
WSADATA data;
WORD p;
int len(char *);
int lun, err=0;
char mex[]="SERVER attivo: in attesa di messaggi!!!\n";
p=MAKEWORD(2,0);

loading:

err=WSAStartup(p,&data);


miosock=socket(PF_INET,SOCK_STREAM,0);
miosock_addr.sin_family=PF_INET;
miosock_addr.sin_port=htons(atoi("1111"));
miosock_addr.sin_addr.s_addr=INADDR_ANY;
err=bind(miosock,(struct sockaddr*)&miosock_addr,sizeof(struct sockaddr_in));
err=listen(miosock,1);
lun=sizeof (struct sockaddr);
client=accept(miosock,(struct sockaddr*)&client_addr,&lun);
if (err!=0) printf ("Errore connessione");

//**************dialogo***************/
send(client,mex,sizeof(mex),0);

int recverr = 0;
for(;;){
char mex2[0];
recverr = recv(client,mex2,1,0);
//printf("recv: %d\n",recverr);
if (recverr <= 0){ closesocket (client); closesocket(miosock); WSACleanup(); goto loading; }
printf("%s",mex2);



}//chiusura for
closesocket (client);
closesocket(miosock);
WSACleanup();

//end
system("pause");
return 0;
}

mamo139
30-11-2007, 21:00
questo è il client che ho appena modificato... si verifica una cosa che non mi sarei mai aspettato: io scrivo una frase nella console del client e nel server nn succede nulla... poi schiaccio invio e nel server compare la frase... chi mi spiega come mai???:mc:
usando la getch l'effetto che mi sarei aspettato è che il primo carattere da me digitato finisse subito nel server...:cry:


#include <windows.h>
#include <winsock.h> //includo le varie librerie tra cui quella winsock
#include <stdio.h>

int main(int argn,char **argv)
{

int err = 0;

SOCKET sock; // creo la socket chiamato sock che userò nella connessione
struct sockaddr_in sock_addr; // inizializzo la socket
WSADATA data; // inizializzo la variabile che contiene le primitive di Winsock
WORD p;
p=MAKEWORD(2,0); // creo la variabile p che contiene la versione della wsock32.dll

char messaggio[2000];
int errori = 0;


err = WSAStartup(p,&data); // inizializzo la wsock32.dll verificandone la mancanza di errori



sock=socket(PF_INET,SOCK_STREAM,0); // creo la socket indicandone le caratteristiche
sock_addr.sin_family=PF_INET; // indico il protocollo utilizzato (TCP/IP)
sock_addr.sin_port=htons(1234); //indico la porta a cui connettere la socket
sock_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico l'indirizzo IP
sock_addr.sin_addr.S_un.S_un_b.s_b2=0;
sock_addr.sin_addr.S_un.S_un_b.s_b3=0;
sock_addr.sin_addr.S_un.S_un_b.s_b4=1;

err = connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr)); // mi connetto all'indirizzo scelto



char mex[2000];
recv(sock,mex,2000,0);

printf("FROM server: %s",mex);

for (int x=0;;x++){
//*********************dialogo***********************//
char string[0];
//scanf("%s",string);
string[0] = getchar();
errori = send(sock,string,1,0);
string[0]='\0';

if (errori <= 0)
printf("errore!!!!!!!!!!!!!!");


}

closesocket(sock); // chiudo la socket
WSACleanup(); //libero le risorse utilizzate dalla libreria Winsock

//end for


printf("\n\n%d\n",err);


return 0;
}