Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Winsock2 Client/Server Invio file
Forum - C/C++ - Winsock2 Client/Server Invio file

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Valcars (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/05/2012

Segnala al moderatore
Postato alle 21:20
Lunedì, 14/10/2013
Salve a tutti sono nuovo del forum e posto qui perchè so che siete gli unici a farmi chiarire un pò le idee perchè sto facendo una confusione mai vist...
Allora vi spiego il Client e il Server comunicano fra loro perfettamente senza problemi però quello che riesco a far inviare è solo una stringa io invece vorrei che il client invii un file al server ma so che per fare cio visto che il C non dispone di un comando per inviare file bisogna
1.Aprire il file
2.Leggere il contenuto del file
3.Copiarlo in memoria
4.inviarlo al server tramite send()

Mentre per il Server
1.Ricevere il messaggio
2.leggerlo
3.Salvarlo in un file
Beh.. io le sto provando tutte ma quando compilo mi da sempre errore
Pultroppo guide complete su questo argomento non ne ho trovate se qualcuno abbia la bontà di spiegarmelo ne sarò grato :)


Ola :D
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:53
Lunedì, 14/10/2013
Se compili e hai un errore perché non ce lo mostri?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
lollo 97 (Member)
Rookie


Messaggi: 50
Iscritto: 27/06/2011

Segnala al moderatore
Postato alle 16:29
Martedì, 15/10/2013
dacci l'errore e ti diremo!
Che tipo di file devi inviare? Se è un file di testo lo leggi con fopen e poi lo invii come stringa...


Se non è nebbia, è fumo.
PM Quote
Avatar
Valcars (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/05/2012

Segnala al moderatore
Postato alle 17:14
Martedì, 15/10/2013
Allora in poche parole non mi fa scrivere il percorso del file che voglio aprire ora ve lo posto cmq lo sto compilando con visual c++ perchè con mingw non lo riuscivo a compilare quando implementavo la winsock... questo è anche un'altro problema che vorrei essere spiegato :\!!!!
cmq ecco il codice

Codice sorgente - presumibilmente C++

  1. #include "stdafx.h"
  2. #include "winsock2.h"
  3. #include "string.h"
  4. #define FILE_w = "prova.txt"
  5.  
  6.  
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9.  
  10. WSADATA wsaData;
  11. int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  12.  
  13.  if (iResult != NO_ERROR)
  14. printf("Client: Errore Inizializzazione Socket.\n");
  15. else
  16. printf("Client: Inizializzazione Socket.\n");
  17.  
  18.  
  19.  
  20.  
  21. SOCKET m_socket;
  22.  
  23. m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  24. if (m_socket == INVALID_SOCKET)
  25.         {
  26.                 printf("Client: Errore socket(): %ld\n", WSAGetLastError());
  27.                 WSACleanup();
  28.                 return 0;
  29.         }
  30. else
  31. printf("Client: Socket Avviato.\n");
  32.  
  33.  
  34.  
  35.  
  36. sockaddr_in clientService;
  37.  
  38. clientService.sin_family = AF_INET;                                     //Famiglia protocollo TCP
  39. clientService.sin_addr.s_addr = inet_addr("127.0.0.1");         //Ip a cui si connette il client
  40. clientService.sin_port = htons(55555);                                  //Porta aperta per la connessione al server
  41.  
  42. if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
  43.         {
  44.                 printf("Client: Connessione Fallita.\n");
  45.                 WSACleanup();
  46.                 return 0;
  47.         }
  48.  
  49.  
  50.  
  51.  
  52.  
  53. int bytesSent;
  54. int bytesRecv = SOCKET_ERROR;
  55. char sendbuf[1024] ;                                             
  56. char recvbuf[1024] ;   
  57.  
  58.  
  59. bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
  60. printf("Client: send() - Bytes Inviati: %ld\n", bytesSent);
  61.  
  62. while(bytesRecv == SOCKET_ERROR)
  63.  
  64.     {
  65.                 bytesRecv = recv(m_socket, recvbuf, 32, 0);
  66.                 if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
  67.  
  68.                         {
  69.                                 printf("Client: Chiusa Connessione.\n");
  70.                                 break;
  71.  
  72.                         }
  73.  
  74.         else
  75.                         printf("Client: recv() e' OK.\n");
  76.                         if (bytesRecv < 0)
  77.                         return 0;
  78.                         else
  79.                                 {
  80.                                         printf("Client: dati ricevuti sono \"%s\"\n", recvbuf);
  81.                                         printf("Client: Bytes ricevuti - %ld.\n", bytesRecv);
  82.                                 }
  83.                 }
  84.  
  85.                
  86. bytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);
  87. if (bytesSent == SOCKET_ERROR)
  88.         printf("Client:Errore Invio dati %ld \n", WSAGetLastError ());
  89. else
  90.         {
  91.                 printf ("Client:Byte Inviati: %ld \n", bytesSent);
  92.                 printf("Client: La stringa di prova inviata: \"%s\"\n", sendbuf);
  93.         }      
  94.                                                                                
  95. // Apre file
  96. FILE *fp;
  97. fp = fopen(FILE_w,"r");
  98. while(!feof(fp))
  99. {
  100. bytesSent = send(m_socket, fp,strlen(sendbuf),0);
  101. if (bytesSent == SOCKET_ERROR)
  102. printf("Client:Errore Invio dati %ld \n", WSAGetLastError ());
  103. //qui mi sono bloccatooo
  104. }
  105.  
  106. WSACleanup();
  107.  
  108.         return 0;
  109. }



In poche parole se inserisco una stringa in "sendbuf e la voglio inviare al server funziona perfettamente ma non ho capito come posso fare se voglio inviare un file di testo o ad esempio una stringa scritta da tastiera se qualcuno mi può spiegare :\ e scusate x la confusione :P

Ultima modifica effettuata da Valcars il 15/10/2013 alle 17:33


Ola :D
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:52
Martedì, 15/10/2013
Certo che c'è confusione ...

Prima scrivi "quando compilo mi da sempre errore" e quando ti chiedo l'errore non lo dici ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Valcars (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/05/2012

Segnala al moderatore
Postato alle 18:09
Martedì, 15/10/2013
mi da errore C699 fopen che dice di cambiarlo in fopen_s  con visual c++ l'ho provato a cambiare ma  mi da erroe quando metto il nome del file
es

nel codice ho messo un #define File_w = "prova.txt" per aprire il file però quando vado a usare la funzione
FILE *fp
fp = fopen(File_W,"r"); <----- mi da errore su File_W e mi dice di cambiare in fopen_s ho provato a cambiare ma sempre la stessa cosa.....ti ripeto mi sono bloccaTO qua non so nemmeno se il file lo invia o no ancora devo provare perchè non riesco a capire quale sia il problema....
spero di essere stato un pò + chiaro ora......!!!

Ultima modifica effettuata da Valcars il 15/10/2013 alle 18:10


Ola :D
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:16
Martedì, 15/10/2013
Testo quotato

Postato originariamente da Valcars:

mi da errore C699 fopen che dice di cambiarlo in fopen_s  con visual c++ l'ho provato a cambiare ma  mi da erroe quando metto il nome del file



Quello non è un errore ma una raccomandazione. Per ora puoi ignorarla ...

Ti viene proprio indicato come "error" o "warning" ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Valcars (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/05/2012

Segnala al moderatore
Postato alle 23:58
Martedì, 15/10/2013
nessuno ho risolto il problema ho compilato il file con mingw e non mi ha dato problemi però ora ho un'altro problema ho scritto sia il client che il server e quando li compilo non mi da nessun errore però quando cerco di avviare i 2 exe il server rimane aperto mentre il client si chiude subito senza darmi errore....
ora vi posto i sorgenti se potete dirmi dove sto sbagliando e se ci vuole qualche aggiustatina :D

CLIENT
Codice sorgente - presumibilmente C++

  1. #include "stdio.h"
  2. #include "winsock2.h"
  3. #include "string.h"
  4. #define files "prova1.txt"
  5.  
  6. int main()
  7. {
  8. //---Inizializza Winsock
  9. WSADATA wsaData;
  10. int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  11.  
  12.  if (iResult != NO_ERROR)
  13. printf("Client: Errore WSAStartup().\n");
  14. else
  15. printf("Client: WSAStartup() e' OK.\n");
  16.  
  17.  
  18. //--- Crea Socket
  19.  
  20. SOCKET m_socket;
  21.  
  22. m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  23. if (m_socket == INVALID_SOCKET)
  24.         {
  25.                 printf("Client: socket() - Errore al socket(): %ld\n", WSAGetLastError());
  26.                 WSACleanup();
  27.                 return 0;
  28.         }
  29. else
  30. printf("Client: socket() e' OK.\n");
  31.  
  32.  
  33.  
  34. //---Connessione al server
  35.  
  36.  
  37. struct sockaddr_in clientService;
  38.  
  39. clientService.sin_family = AF_INET;                                                     //Famiglia protocollo TCP
  40. clientService.sin_addr.s_addr = inet_addr("127.0.0.1");         //Ip a cui si connette il client
  41. clientService.sin_port = htons(55555);                                          //Porta aperta per la connessione al server
  42.  
  43. if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
  44.         {
  45.                 printf("Client: connessione() - Fallita la connessione.\n");
  46.                 WSACleanup();
  47.                 return 0;
  48.         }
  49.  
  50.        
  51. //---Invia e riceve dati
  52.  
  53.  
  54. int bytesSent;
  55. int bytesRecv = SOCKET_ERROR;
  56. char sendbuf[1024] ;                   
  57. char recvbuf[1024] ;                                                                                   
  58.  
  59.  
  60. bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
  61. printf("Client: send() - Bytes Inviati: %ld\n", bytesSent);
  62.  
  63. while(bytesRecv == SOCKET_ERROR)
  64.  
  65.     {
  66.                 bytesRecv = recv(m_socket, recvbuf, 32, 0);
  67.                 if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
  68.  
  69.                         {
  70.                                 printf("Client: Chiusa Connessione.\n");
  71.                                 break;
  72.  
  73.                         }
  74.  
  75.         else
  76.                         printf("Client: recv() e' OK.\n");
  77.                         if (bytesRecv < 0)
  78.                         return 0;
  79.                         else
  80.                                 {
  81.                                         printf("Client: dati ricevuti sono \"%s\"\n", recvbuf);
  82.                                         printf("Client: Bytes ricevuti - %ld.\n", bytesRecv);
  83.                                 }
  84.                 }
  85.  
  86. bytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);
  87. if (bytesSent == SOCKET_ERROR)
  88.         printf("Client send() errore %ld \n", WSAGetLastError ());
  89. else
  90.         {
  91.                 printf ("Client: send () e' OK - Byte Inviati: %ld \n", bytesSent);
  92.                 printf("Client: La stringa di prova inviata: \"%s\"\n", sendbuf);
  93.         }
  94.        
  95.        
  96.        
  97. FILE *fp;
  98. char ch, *fbuff;
  99. int indice, fileDim = 0;
  100. bytesRecv = recv (m_socket, fbuff,strlen(fbuff), 0);
  101. fp = fopen(files,"w");
  102. fprintf(fp,"%s",files);
  103. fclose;
  104.  
  105.  
  106.  
  107. WSACleanup();
  108.  
  109.         return 0;
  110. }




Server:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include "winsock2.h"
  5.  
  6. #define FILEs  "prova.txt"
  7.  
  8. int main()
  9. {
  10.  
  11. //---Inizializza Winsock
  12. WORD wVersionRequested;
  13. WSADATA wsaData;
  14. int wsaerr;                                     //Variabile che restituisce 1 se errore
  15.  
  16. wVersionRequested = MAKEWORD(2, 2);
  17.  
  18. wsaerr = WSAStartup(wVersionRequested, &wsaData);
  19. if (wsaerr != 0)
  20.         {      
  21.                 printf("WinSock DLL non trovata \n");
  22.                 return 0;
  23.         }
  24. else
  25.         {
  26.                 printf("Trovata Winsock DLL. \n");
  27.                 printf("Stato: %s.\n", wsaData.szSystemStatus);
  28.         }
  29. if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
  30.         {
  31.                 printf("La DLL non supporta la versione di Winsock %u. %u!\n", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
  32.                 WSACleanup();
  33.                 return 0;
  34.         }
  35.  
  36. else
  37.         {
  38.                 printf("La DLL supporta la version di Winsock %u.%u\n!", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
  39.                 printf("La versione piu alta che e' in grado di supportare questa DLL e': %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
  40.         }
  41.  
  42.  
  43. //--- Crea Socket
  44. SOCKET m_socket;
  45.  
  46. m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  47.  
  48. if (m_socket == INVALID_SOCKET)
  49.         {
  50.                 printf("Errore al socket():%ld\n", WSAGetLastError());
  51.                 WSACleanup();
  52.                 return 0;
  53.         }
  54. else
  55.         {
  56.                 printf("il Socket() e' OK!\n");
  57.         }
  58.        
  59.  
  60.        
  61. //---Connessione al server
  62. //creiamo l'oggetto sockaddr_in e settiamo il valore
  63. struct sockaddr_in service;
  64.  
  65.  
  66. service.sin_family=AF_INET;                                                             //Famiglia di indirizzo internet
  67. service.sin_addr.s_addr = inet_addr("127.0.0.1");       //Indirizzo IP della macchina
  68. service.sin_port = htons(55555);                                                //Porta su quale connettersi
  69.  
  70. //Chiamiamo la funzione bind
  71. if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
  72.         {
  73.                 printf("bind() fallito: %ld.\n",WSAGetLastError());
  74.                 closesocket(m_socket);
  75.                 return 0;
  76.         }
  77. else
  78.         {
  79.                 printf("bind() e' OK!\n");
  80.  
  81.         }
  82.        
  83.         /* Server In connession */
  84. if (listen(m_socket, 1) == SOCKET_ERROR)
  85.         printf("listen(): Errore socket listening %ld. \n", WSAGetLastError());
  86. else
  87.         {
  88.                 printf("listen() e' OK, Aspetto connessione....\n");
  89.         }
  90. SOCKET AcceptSocket;
  91.  
  92. printf("Server: Aspetta che il client si connetta....\n");
  93. printf("***Hint; Server avviato...avvia il tuo client...***\n");
  94.  
  95. while (1)
  96.         {
  97.  
  98.                 AcceptSocket = SOCKET_ERROR;
  99.                         while (AcceptSocket == SOCKET_ERROR)
  100.                         {
  101.                                 AcceptSocket = accept(m_socket, NULL, NULL);
  102.                         }
  103.  
  104.                         //Altrimenti se accetta la connesione
  105.                         printf("Server: Client Connesso!\n");
  106.                         m_socket = AcceptSocket;
  107.                         break;
  108. }
  109.  
  110. int BytesSent;
  111. int bytesRecv = SOCKET_ERROR;
  112. char sendbuf [200];
  113. char recvbuf [200] ;
  114.  
  115.  
  116. //Invia stringa al client
  117. printf ("Server: L'invio di alcuni dati..\n");
  118.  
  119. BytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);
  120.  
  121. if (BytesSent == SOCKET_ERROR)
  122.         printf("Server: send() errore %ld \n", WSAGetLastError ());
  123. else
  124. {
  125.         printf ("Server: send () e' OK. \n");
  126.         printf("Server: Byte Inviati: %ld \n", BytesSent);
  127. }
  128.  
  129. //Riceve una stringa di prova dal cliente ... e cliente Deve inviare qualcosa lol ...
  130. bytesRecv = recv (m_socket, recvbuf, 200, 0);
  131.  
  132. if (bytesRecv == SOCKET_ERROR)
  133.         printf ("Server: recv() errore %ld \n", WSAGetLastError());
  134. else
  135. {
  136.         printf ("Server: recv_() e' OK\n");
  137.         printf ("Server: dati ricevuti sono \"%s\"\n", recvbuf);
  138.         printf ("Server: Byte ricevuti: %ld \n", bytesRecv);
  139.        
  140. }
  141. FILE *fp;
  142. char ch, *fbuff;
  143. int indice, fileDim = 0;
  144. if((fp=fopen(FILEs,"r"))!=NULL)
  145. {
  146. //Si posizione alla ine del file
  147. fseek(fp, 0, SEEK_END);
  148. //Legge la posizione attuale
  149. fileDim = ftell(fp);
  150. //alloca la dimensione del buffer
  151. fbuff = (char*)malloc(sizeof(char) * fileDim+1);
  152. printf("Dimensione del file %s=%d\n",FILEs,fileDim);
  153. //mi porto all'inizio del file
  154. fseek(fp, 0, SEEK_SET);
  155. //Copio il contenuto del file nel buffer
  156. fread(fbuff, fileDim, 1, fp);
  157. //invio il contenuto del buffer al client
  158. BytesSent = send (m_socket,fbuff,strlen(fbuff),0);
  159. if (BytesSent == SOCKET_ERROR)
  160.         printf("Server: File non inviato \n", WSAGetLastError ());
  161. else
  162. {
  163.         printf ("Server: File inviato \n");
  164.         printf("Server: Byte Inviati: %ld \n", BytesSent);
  165. }
  166. }
  167.  
  168.  
  169. WSACleanup();
  170.  
  171. return 0;
  172.  
  173.  
  174.  
  175.  
  176. }



Ola :D
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1457
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:00
Mercoledì, 16/10/2013
per compilare con Visual Studio devi guardare come si disabilitano gli errori dovuti all' utilizzo di funzioni unsafe....

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo