Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    30

    [C]Invio/ricezione/elaborazione stringhe con le socket

    Qui di seguito il codice di un programma per inviare e ricevere stringhe tra un client ed un server. Dopo uno scambio di frasi per indicare il successo dell'avvenuta connessione, il client invia una stringa al server, il quale rimuove le vocali e la reinvia al client. Il problema principale è che aggiunge caratteri che non c'entrano al termine della mia stringa.
    So che da qualche parte ci sono errori sulle terminazioni con lo 0 e le lunghezze, ma le sto provando tutte e sto nel pallone. Dove sbaglio?

    codice:
    **SERVER SIDE**
    
    #if defined WIN32
    #include <winsock2.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>
    
    #define BUFSIZE 30
    
    void ClearWinSock() {
    #if defined WIN32
        WSACleanup();
    #endif
    }
    
    int main(void) {
    
    //---------------------------INIZIALIZZAZIONE WSADATA
    
    #if defined WIN32
    
        WSADATA wsaData;
        int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != 0) {
            printf ("Error at WSAStartup");
            return 0;
        }
    
    #endif
    
    //-------------------------------CREAZIONE SOCKET
    
      int Mysocket;
      Mysocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (Mysocket < 0) {
          printf("socket creation failed\n");
          return 0;
      }
    
      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 (9888);
    
    //------------------------ASSEGNAZIONE PORTA E IP ALLA SOCKET
    
    if (bind(Mysocket, (struct sockaddr*) &sad, sizeof(sad)) <0) {
        printf ("bind() failed\n");
        closesocket(Mysocket);
        return 0;
    }
    
    //---------------------------SETTAGGIO SOCKET ALL'ASCOLTO
    
    int qlen = 10;
    
    if (listen (Mysocket, qlen) < 0) {
    
        printf("listen() failed\n");
        closesocket(Mysocket);
        return 0;
    }
    
    struct sockaddr_in cad;
    int Csocket;
    int clientlen;
    
    //------------------------------ACCETTA LA CONNESSIONE
    
    while (1) {
    
        printf("In attesa di un client con cui comunicare\n");
        memset(&cad, 0, sizeof(cad));
        clientlen = sizeof(cad);
    
        if((Csocket = accept(Mysocket, (struct sockaddr*) &cad, &clientlen)) < 0) {
            printf ("accept failed\n");
            closesocket(Mysocket);
            ClearWinSock();
            return 0;
            }
    
        printf("connesso con il client\n");
    
    
    //---------------------------------------INVIO STRINGA AL CLIENT
    
        char* inputString = "connessione avvenuta";
        int stringlen = strlen(inputString);
    
    
        if (send(Csocket, inputString, stringlen, 0) != stringlen) {
            printf("client-send() sent a different number of bytes than expected");
            closesocket(Csocket);
            ClearWinSock();
            system ("pause");
            return 0;
        }
    
    
    //-------------------------------------RICEZIONE STRINGA DAL CLIENT
    
        char str1[BUFSIZE+1]; char str1des[BUFSIZE+1];
        int i,j=0;
    
        //recv (Csocket, str1, BUFSIZE - 1, 0);
    
        int read = recv(Csocket, str1, BUFSIZE-1, 0); str1[read] = '\0';
    
    
    //-------------------------------ELIMINAZIONE VOCALI DALLA STRINGA RICEVUTA
    
        for(i=0;i<=strlen(str1)+1;i++) {
    
            if(str1[i]=='a'||str1[i]=='e'||str1[i]=='i'||str1[i]=='o'||str1[i]=='u' ||str1[i]=='A'||str1[i]=='E'||str1[i]=='I'||str1[i]=='O'||str1[i]=='U')
                            str1[i]=' ';
                    else
                            str1des[j++]=str1[i];
                }
    
                str1des[j]='\0';
    
    //-----------------------------------INVIO STRINGA ELABORATA AL CLIENT
    
                if (send(Csocket, str1des, strlen(str1des), 0) != strlen(str1des)) {
                    printf("client-send() sent a different number of bytes than expected");
                    closesocket(Csocket);
                    ClearWinSock();
                    system ("pause");
                    return 0;
                }
    
    }
    
    //------------------------------------------CHIUSURA CONNESSIONE
    
    closesocket (Csocket);
    ClearWinSock();
    printf ("\n");
    system ("pause");
    return 0;
    
    }
    
    **CLIENT SIDE**
    
    #if defined WIN32
    #include <winsock2.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>
    
    #define BUFSIZE 30
    
    void ClearWinSock() {
    #if defined WIN32
        WSACleanup();
    #endif
    }
    
    //-----------------------------INIZIALIZZAZIONE WSADATA
    
    int main (void) {
    #if defined WIN32
    
        WSADATA wsaData;
        int iResult = WSAStartup (MAKEWORD (2,2), &wsaData);
    
        if (iResult !=0) {
            printf ("error at WSASturtup\n");
            return 0;
            }
    
    #endif
    
    
    //--------------------------------CREAZIONE SOCKET
    
        int Csocket;
    
        Csocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
    
        if (Csocket < 0) {
    
        printf ("socket creation failed");
        closesocket (Csocket);
        ClearWinSock();
        return 0;
        }
    
     //--------------------------COSTRUZIONE INDIRIZZO SERVER
    
       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 (9888);
    
    
    //------------------------------CONNESSIONE AL SERVER
    
      if (connect(Csocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) {
          printf ("failed to connect\n");
          closesocket (Csocket);
          ClearWinSock();
          return 0;
      }
    
    
    //-----------------------------RICEZIONE DATI DAL SERVER
    
      char buf[BUFSIZE+1];
    
      int read = recv (Csocket, buf, BUFSIZE - 1, 0);
    
    if (read <=0) {
    
        printf ("Qualcosa non và!\n");
    }
    
    else {
        buf[read+1] = '\0';
        printf("Server scrive: %s\n", buf);
    }
    
    
    //----------------------------INVIO PRIMA STRINGA AL SERVER
    
    char str1[BUFSIZE+1]; int stringlen = strlen(str1);
    printf ("inserisci prima stringa:\n");
    scanf ("%s", str1);
    
    if (send(Csocket, str1, stringlen, 0) != stringlen) {
        printf("client-send() sent a different number of bytes than expected");
        closesocket(Csocket);
        ClearWinSock();
        system ("pause");
        return 0;
    }
    
    //------------------------------RICEZIONE STRINGA ELABORATA DAL SERVER
    
    char buf2[BUFSIZE+1];
    
      int read2 = recv (Csocket, buf2, BUFSIZE - 1, 0);
    
    if (read2 <=0) {
    
        printf ("Qualcosa non và!\n");
    }
    
    else {
        buf2[read+1] = 0;
        printf("Server scrive: %s\n", buf2);
    }
    
    //---------------------------------------CHIUSURA CONNESSIONE
    
    closesocket (Csocket);
    ClearWinSock();
    printf ("\n");
    system ("pause");
    return 0;
    
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    30
    Bene..ho corretto. Non appaiono più caratteri strani, però alcune parole le tronca e/o mi aggiunge un solo carattere finale che non c'entra.
    Ho corretto anche quest'altra parte separando la dichiarazione di stringlen

    char str1[BUFSIZE+1]; int stringlen;
    printf ("inserisci prima stringa:\n");
    scanf ("%s", str1);
    stringlen = strlen(str1);
    if (send(Csocket, str1, stringlen, 0) != stringlen) {

    Cos'altro ho sbagliato?
    Ultima modifica di mark9; 29-12-2015 a 11:41

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.