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

    [c/c++] socket: client-server

    per il momento questi due programmi funzionano, ma i cicli for per l'invio di piu stringhe li ho messi esterni a WSAStartup e WSACleanup, quindi ad ogni invio di stringa il server si riavvia e il client ricerca l'ip e si riconnette... come posso evitare che i due programmi si riavviino ogni volta??? grazie ciao

    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;
    for (int x=0;;x++){
    
    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(1111); //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
     
     //*********************dialogo***********************//
    
    if (x==0){
     	char mex[2000];
     	recv(sock,mex,2000,0);
    
     	 printf("FROM server: %s",mex); 	 
        }
              
    
     	 	
     	 	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>
    #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);
    	
    		   for(;;){
    	
    	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);
    	
    	 	char mex2[2000];
    
     	recv(client,mex2,2000,0);
    printf("%s\n\n",mex2);
    
    
    	
    	
    	closesocket (client);
    	closesocket(miosock);
    
    	WSACleanup();
    	
    	
    }//chiusura for
    	
    	
    //end
    
    	system("pause");
    	
    	return 0;
    }

  2. #2
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    mi pare che la risposta te la sia dato da solo.....

    Metti WSAStartup e WSACleanup fuori dal ciclo...
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  3. #3
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    grazie: sapevo di essere inesperto, ma non pensavo mi riteneste un deficiente!!!

    scherzi a parte ci ho provato ma nn è così che si risolve il problema!!!
    rinnovo la richiesta di aiuto


  4. #4
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    Nei tuoi programmi ci sono vari errori logici. WSAStartup inizializza le strutture di winsock e va eseguito una sola volta all'inizio del programma prima di eseguire qualsiasi operazione che coinivolga le socket. Idem per WSACleanup. Indi per cui non li puoi mettere nel ciclo ma rispettivamente prima e dopo il ciclo.

    Idem per il riempimento della struttura sock_addr. Va prima dell'inizio del ciclo.
    Idem per connect e per closesocket, va dopo la fine del ciclo. Stai usando una socket STREAM... la connessione persiste finche non la chiudi.

    A blocchi:
    codice:
    WSAStartup
    socket()
    riempimento sock_addr
    connect
    if (x==0){ recv...}
    
    for(;;)
    {
    
     dialogo
    
    }
    
    closesocket
    WSACleanup
    Idem per il server:

    codice:
    WSAStartup
    socket()
    riempimento sock_addr
    bind
    listen
    accept
    
    send
    
    for(;;)
    {
    
     recv
    
    }
    
    closesocket
    WSACleanup

    studiadi bene cosa fanno i vari comandi sulle socket...
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  5. #5
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    gia.... in effetti funziona anche così, solo che xò così quando chiudo il client il server mostra all'infinito l'ultimo messaggio inviato dal client!!! come evitare???

    grazie ciao

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Devi controllare cosa restituisce la recv ... dai un'occhiata nell'help al funzionamento di questa funzione ...

  7. #7
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    approfitto x un altra domanda: e x l'invio di file come si fa??? grazie

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usi la funzione send, in maniera opportuna.

  9. #9
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    ...ovvero?? esempietto??

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh ... per fare un esempio di invio di un file con la send non ci vogliono cinque minuti ...

    Faccio qualche ricerca per vedere se c'e' qualcosa di pronto ... falla anche tu ...

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.