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: 6402
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: 6402
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: 6402
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