Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841

    [c] comunicazione fra client e server

    è 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
    codice:
    #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
    codice:
    #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;
    }

  2. #2
    wow, erano lustri che non vedevo il goto ;-)

  3. #3
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    tralasciando il goto nessuno ha qualche idea??

    volendo mi basta anche solo una dritta col server... così provo se funziona con telnet

  4. #4
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    il server l'ho sistemato così e ora con telnet va benissimo
    codice:
    #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("1234"));
    	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;
    }

    per il client invece ho fatto così
    ora quello che scrivo compare subito nel server... solo che nel client nn vedo quello che scrivo e in piu l'invio non va a capo ma torna solo all'inizio della riga nel server... che casino


    codice:
    #include <windows.h>
    #include <winsock.h> //includo le varie librerie tra cui quella winsock
    #include <stdio.h>
    #include <conio.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();
          string[0] = _getch();
          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;
    }

  5. #5
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    perchè oregon aiuta tutti tranne me???

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho preferenze ... anzi ... ricordo che tempo fa ti avevo aiutato sullo stesso argomento ...

    Ma non ho tempo sufficiente per rispondere a tutto e correggere questo tipo di codice ne prende tanto (oltre al fatto che, quando non capisco l'utilita' di una richiesta, tendo a non prenderla in considerazione ... comunque ...).

    Per la visualizzazione mi sembra che tu debba usare la funzione

    _getche()

    e non la

    _getch();

    in quanto la prima genera l' echo su console.

    Per il ritorno a capo, inserisci nel server un controllo in modo che se riceve il CR visualizza la sequenza CRLF
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    grazie mille per la risposta, e mi ricordo di tutto l'aiuto che mi hai dato, molte cose le ho capite grazie ai tuoi aiuti e infatti non a caso ho fatto appello a te

    cmq per corrattezza t spiego cosa sto facendo
    visto che è da un po che nn programmo e nn so cosa fare per imparare a lavorare anche con le finestre e nn solo con la console voglio creare un chat... solo che prima di fare con le finestre provo a vedere se sn in grado con la console

    ora vedo di provare le funzioni che m hai dato

    grazie ancora a presto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.