Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - recv Winsock -- ricevo stringa con caratteri finali strani
Forum - C/C++ - recv Winsock -- ricevo stringa con caratteri finali strani

Avatar
Gemini (Normal User)
Rookie


Messaggi: 33
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 19:03
Martedì, 01/03/2022
Salve a tutti non so se il titolo va bene ma non sapevo come scrivere XD in ogni caso ho un problemino che non riesco a capire dove sbaglio in pratica ho creato un server e client con winsock2 la connessione funziona ma quando ricevo un messaggio dal alla fine della stringa mi escono simboli strani.... qualcuno sa aiutarmi vi mostro il codice e alcuni screen

CLASSE NETWORK

NETWORK.h

Codice sorgente - presumibilmente C++

  1. #include <winsock2.h>
  2.  
  3.  
  4. #pragma comment(lib, "ws2_32.lib")
  5.  
  6.  
  7. class Network
  8. {
  9.     public:
  10.  
  11.     //Metodi Connessione
  12.     int ServerTCP();
  13.     int ClientTCP();
  14.  
  15.     //Metodi Invio/Ricezione dati
  16.     void socketSend(char *sendbuf);
  17.     char* socketRecv();
  18.    
  19.  
  20.  
  21.  
  22.     private:
  23.     //Variabili Private
  24.     WSAData wsaData;
  25.     WORD DllVersion = MAKEWORD(2, 1);
  26.  
  27.     SOCKET s_socket;
  28.     SOCKET a_socket;
  29.  
  30.     int c;
  31.  
  32.     struct sockaddr_in sokAddr_in;
  33.     struct sockaddr_in client;
  34.  
  35.     //Metodi privati
  36.     int initSocket();
  37.     int createSocket(int type);
  38.     bool closeSocket();
  39.     int bindSocket();
  40.     int acceptSocket();
  41.     int connectSocket();
  42. };




NETWORK.CPP
Codice sorgente - presumibilmente C++

  1. #include "Network.h"
  2. #include <stdio.h>
  3.  
  4. //===============================================//
  5. //=                ServerTCP                    =//
  6. //===============================================//
  7. int Network::ServerTCP()
  8. {
  9.     if(initSocket() != 0)
  10.     {
  11.         printf("Errore durante ServerTCP() -- initSocket()\n");
  12.         return -1;
  13.     }
  14.     if(createSocket(0) != 0)
  15.     {
  16.         printf("Errore durante ServerTCP() -- createSocket()\n");
  17.         return -1;
  18.     }
  19.     if(bindSocket() != 0)
  20.     {
  21.         printf("Errore durante ServerTCP() -- bindSocket()\n");
  22.         return -1;
  23.     }
  24.     if(acceptSocket() != 0)
  25.     {
  26.         printf("Errore durante ServerTCP() -- acceptSocket()\n");
  27.         return -1;
  28.     }
  29.     return 0;
  30. }
  31.  
  32. //===============================================//
  33. //=                ClientTCP                    =//
  34. //===============================================//
  35. int Network::ClientTCP()
  36. {
  37.     if(initSocket() != 0)
  38.     {
  39.         printf("Errore durante ClientTCP() -- initSocket()\n");
  40.         return -1;
  41.     }
  42.     if(createSocket(1) != 0)
  43.     {
  44.         printf("Errore durante ClientTCP() -- createSocket()\n");
  45.         return -1;
  46.     }
  47.     while(connectSocket() != 0)
  48.     {
  49.         printf("Errore durante ClientTCP() -- connectSocket()\n");
  50.         //return -1;
  51.     }
  52.  
  53.     return 0;
  54. }
  55.  
  56.  
  57. //===============================================//
  58. //=                socketSend                   =//
  59. //===============================================//
  60. void Network::socketSend(char *sendbuf)
  61. {
  62.         int sendResult;
  63.         sendResult = send(a_socket, sendbuf,(int)strlen(sendbuf), 0);
  64.         if(sendResult == SOCKET_ERROR)
  65.         {
  66.                 printf("socketSend() Fallito %d\n",WSAGetLastError());
  67.                 closeSocket();
  68.                 return;
  69.         }
  70.  
  71.         printf("Byte invitati %d\n",sendResult);
  72. }
  73.  
  74.  
  75. //===============================================//
  76. //=                socketRecv                           =//
  77. //===============================================//
  78. char* Network::socketRecv()
  79. {
  80.         int recvResult;
  81.         char recvbuf[1024];
  82.         int recvbuflen = 1024;
  83.         char* tmp = recvbuf;
  84.  
  85.         do
  86.         {
  87.                
  88.                 recvResult = recv(s_socket,recvbuf,recvbuflen,0);
  89.                 if(recvResult > 0)
  90.                 {
  91.                         printf("byte ricevuti: %d\n", recvResult);
  92.                         //printf("%s\n",recvbuf);
  93.                         return tmp;
  94.                 }
  95.                 else if(recvResult == 0)
  96.                 {
  97.                         printf("Connessione chiusa\n");
  98.                         closeSocket();
  99.                         return NULL;
  100.                 }
  101.                 else
  102.                 {
  103.                         printf("Fallito socketRecv() con errore %d\n",WSAGetLastError());
  104.                         return NULL;
  105.                 }
  106.                        
  107.         } while (recvResult > 0);
  108.  
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115. //===============================================//
  116. //=                initSocket                   =//
  117. //===============================================//
  118. int Network::initSocket()
  119. {
  120.     if (WSAStartup(DllVersion, &wsaData) != 0)
  121.         {
  122.  
  123.                 printf("Fallito initSocket. Errore: %d", WSAGetLastError());
  124.                 return -1;
  125.         }
  126.  
  127.     //Da cancellare
  128.         //server solo per vedere se &#65533; andato tutto bene
  129.         printf("initSocket OK!\n");
  130.  
  131.         return 0;
  132. }
  133.  
  134. //===============================================//
  135. //=                createSocket                 =//
  136. //===============================================//
  137. int Network::createSocket(int type)
  138. {
  139.     if ((s_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  140.         {
  141.  
  142.                 printf("Fallito createSocket. Errore: %d", WSAGetLastError());
  143.                 return -1;
  144.  
  145.         }
  146.     if (type == 0)//SERVER
  147.         {
  148.                 //Prepare the sockaddr_in structure
  149.                 sokAddr_in.sin_family = AF_INET;
  150.                 sokAddr_in.sin_addr.s_addr = INADDR_ANY;
  151.                 sokAddr_in.sin_port = htons(8888);
  152.         }
  153.         else if (type == 1)//CLIENT
  154.         {
  155.                 //Prepare the sockaddr_in structure
  156.                 sokAddr_in.sin_family = AF_INET;
  157.                 sokAddr_in.sin_addr.s_addr = inet_addr("127.0.0.1");
  158.                 //server.sin_addr.s_addr = inet_pton(AF_INET,"127.0.0.1",&server.sin_addr);
  159.                 sokAddr_in.sin_port = htons(8888);
  160.         }
  161.  
  162.     //Da cancellare
  163.         //server solo per vedere se &#65533; andato tutto bene
  164.         printf("createSocket OK!\n");
  165.  
  166.  
  167.         return 0;
  168. }
  169.  
  170. //===============================================//
  171. //=                closeSocket                  =//
  172. //===============================================//
  173. bool Network::closeSocket()
  174. {
  175.         closesocket(s_socket);
  176.         WSACleanup();
  177.  
  178.         return true;
  179. }
  180.  
  181. //===============================================//
  182. //=                bindSocket                   =//
  183. //===============================================//
  184. int Network::bindSocket()
  185. {
  186.         if (bind(s_socket, (struct sockaddr*)&sokAddr_in, sizeof(sokAddr_in)) == SOCKET_ERROR)
  187.         {
  188.                 printf("Fallito bindSocket. Errore: %d", WSAGetLastError());
  189.                 return -1;
  190.         }
  191.  
  192.         //Listen
  193.         listen(s_socket, 3);
  194.  
  195.  
  196.         //Da cancellare
  197.         //server solo per vedere se &#65533; andato tutto bene
  198.         printf("bindSocket OK!\n");
  199.  
  200.         return 0;
  201. }
  202.  
  203. //===============================================//
  204. //=                acceptSocket                   =//
  205. //===============================================//
  206. int Network::acceptSocket()
  207. {
  208.         c = sizeof(struct sockaddr_in);
  209.         a_socket = accept(s_socket, (struct sockaddr*)&client, &c);
  210.         if (a_socket == INVALID_SOCKET)
  211.         {
  212.                 printf("Fallito acceptSocket. Errore: %d", WSAGetLastError());
  213.                 return -1;
  214.         }
  215.  
  216.  
  217.         //Da cancellare
  218.         //server solo per vedere se &#65533; andato tutto bene
  219.         printf("acceptSocket OK!\n");
  220.  
  221.         return 0;
  222. }
  223.  
  224. //===============================================//
  225. //=                connectSocket                =//
  226. //===============================================//
  227. int Network::connectSocket()
  228. {
  229.         if (connect(s_socket, (struct sockaddr*)&sokAddr_in, sizeof(sokAddr_in)) < 0)
  230.         {
  231.                 printf("Fallito connectSocket. Errore: %d\n", WSAGetLastError());
  232.                 return -1;
  233.         }
  234.  
  235.         //Da cancellare
  236.         //server solo per vedere se &#65533; andato tutto bene
  237.         printf("connectSocket OK!\n");
  238.         return 0;
  239. }




CLIENT.CPP
Codice sorgente - presumibilmente C++

  1. #include "../../Utils/Network.h"
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.     Network networks;
  7.  
  8.    
  9.      if(networks.ClientTCP() != 0)
  10.     {
  11.         printf("Errore durante ClientTCP()\n");
  12.         return -1;
  13.     }
  14.  
  15.     //
  16.     //Se il client è connesso
  17.     //
  18.  
  19.     printf("Connesso!\n");
  20.  
  21.     while(true)
  22.     {
  23.         char* tmp = networks.socketRecv();
  24.         printf("%s\n",tmp);
  25.          //networks.socketRecv();
  26.          
  27.          
  28.        
  29.     }
  30.  
  31.    
  32.    
  33.  
  34.     return 0;
  35. }




SERVER.CPP
Codice sorgente - presumibilmente C++

  1. #include "../../Utils/Network.h"
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.     Network networks;
  7.  
  8.    
  9.  
  10.    
  11.     if(networks.ServerTCP() != 0)
  12.     {
  13.         printf("Errore durante ServerTCP()\n");
  14.         return -1;
  15.     }
  16.  
  17.     //
  18.     //Se il client è connesso
  19.     //
  20.     while(true)
  21.     {
  22.         char ok[1024];
  23.         char *msg;
  24.         printf("Connesso!\n");
  25.         scanf("%s",ok);
  26.         msg = ok;
  27.         networks.socketSend(msg);
  28.     }
  29.    
  30.  
  31.  
  32.     return 0;
  33. }






Gemini ha allegato un file: Senza titolo.png (14461 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6318
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:42
Martedì, 01/03/2022
Dove visualizzi il messaggio "byte ricevuti"?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Gemini (Normal User)
Rookie


Messaggi: 33
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 20:26
Martedì, 01/03/2022
ho risolto modificando la funzione in questo modo
Codice sorgente - presumibilmente C++

  1. //===============================================//
  2. //=                socketRecv                           =//
  3. //===============================================//
  4. char* Network::socketRecv(int socketType, int type)
  5. {
  6.         int recvResult;
  7.         char recvbuf[1024];
  8.         int recvbuflen = 1024;
  9.         char* tmp = recvbuf;
  10.  
  11.         do
  12.         {
  13.                
  14.                 recvResult = recv(s_socket,recvbuf,recvbuflen,0);
  15.                
  16.  
  17.                 if(recvResult > 0)
  18.                 {
  19.                         return tmp;
  20.                 }
  21.                 else if(recvResult == 0)
  22.                 {
  23.                         printf("Connessione chiusa\n");
  24.                         closeSocket();
  25.                         return NULL;
  26.                 }
  27.                 else
  28.                 {
  29.                         printf("Fallito socketRecv() con errore %d\n",WSAGetLastError());
  30.                        
  31.                 }
  32.                        
  33.         } while (recvResult > 0);
  34.         return NULL;
  35. }


in pratica faccio ritornare solo il buffer ricevuto e lo stampo dal main del client ora funziona non visualizzo piu i caratteri strani però è c'è un'altro problema in pratica se inserisco ciao come prima parola poi dopo ne inserisco una piu lunga tipo buongiorno e poi dinuovo ciao mi esce la stringa ciaogiorno.... è come se rimane memorizzata la stringa piu lunga...come potrei risolvere quest'altro problemino?

Ultima modifica effettuata da Gemini il 01/03/2022 alle 20:27
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6318
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:57
Martedì, 01/03/2022
E' lo stesso problema


if(recvResult > 0)
{
   tmp[recvResult]=0;
   return tmp;
}

Ultima modifica effettuata da nessuno il 01/03/2022 alle 21:14


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Gemini (Normal User)
Rookie


Messaggi: 33
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 21:52
Martedì, 01/03/2022
oh grazie mille nessuno posso chiederti se puoi spiegarmi il perchè di questo passaggio così da capire meglio... grazie in anticipo!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6318
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:08
Martedì, 01/03/2022
Tu programmi in C, sai che le stringhe sono terminata dal carattere NULL (zero binario)?

Quando invii i dati il NULL non viene trasmesso e lo devi aggiungere tu in ricezione per terminare correttamente la stringa.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Gemini (Normal User)
Rookie


Messaggi: 33
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 13:50
Giovedì, 03/03/2022
Oh grazie mille ora ho capito grazie ancora

PM Quote