Oppure

Loading
14/10/13 19:20
Valcars
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 :)
aaa
14/10/13 19:53
nessuno
Se compili e hai un errore perché non ce lo mostri?
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à.
15/10/13 14:29
lollo 97
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...
aaa
15/10/13 15:14
Valcars
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

#include "stdafx.h"
#include "winsock2.h"
#include "string.h"
#define FILE_w = "prova.txt"


int _tmain(int argc, _TCHAR* argv[])
{

WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

 if (iResult != NO_ERROR)
printf("Client: Errore Inizializzazione Socket.\n");
else
printf("Client: Inizializzazione Socket.\n");




SOCKET m_socket;

m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
	{
		printf("Client: Errore socket(): %ld\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
else
printf("Client: Socket Avviato.\n");




sockaddr_in clientService;

clientService.sin_family = AF_INET;					//Famiglia protocollo TCP
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");		//Ip a cui si connette il client
clientService.sin_port = htons(55555);					//Porta aperta per la connessione al server

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
	{
		printf("Client: Connessione Fallita.\n");
		WSACleanup();
		return 0;
	}





int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[1024] ;			                          
char recvbuf[1024] ;	


bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
printf("Client: send() - Bytes Inviati: %ld\n", bytesSent);

while(bytesRecv == SOCKET_ERROR)

    {
		bytesRecv = recv(m_socket, recvbuf, 32, 0);
		if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)

			{
				printf("Client: Chiusa Connessione.\n");
				break;

			}

        else
			printf("Client: recv() e' OK.\n");
			if (bytesRecv < 0)
			return 0;
			else
				{
					printf("Client: dati ricevuti sono \"%s\"\n", recvbuf);
					printf("Client: Bytes ricevuti - %ld.\n", bytesRecv);
				}
		}

		
bytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);
if (bytesSent == SOCKET_ERROR)
	printf("Client:Errore Invio dati %ld \n", WSAGetLastError ());
else
	{
		printf ("Client:Byte Inviati: %ld \n", bytesSent);
		printf("Client: La stringa di prova inviata: \"%s\"\n", sendbuf);
	}	
										
// Apre file
FILE *fp;
fp = fopen(FILE_w,"r");
while(!feof(fp))
{
bytesSent = send(m_socket, fp,strlen(sendbuf),0);
if (bytesSent == SOCKET_ERROR)
printf("Client:Errore Invio dati %ld \n", WSAGetLastError ());
//qui mi sono bloccatooo
}

WSACleanup();

	return 0;
}




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 15/10/13 15:33
aaa
15/10/13 15:52
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
15/10/13 16:09
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
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 15/10/13 16:10
aaa
15/10/13 17:16
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
15/10/13 21:58
Valcars
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
#include "stdio.h"
#include "winsock2.h"
#include "string.h"
#define files "prova1.txt"

int main()
{
//---Inizializza Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

 if (iResult != NO_ERROR)
printf("Client: Errore WSAStartup().\n");
else
printf("Client: WSAStartup() e' OK.\n");


//--- Crea Socket

SOCKET m_socket;

m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
	{
		printf("Client: socket() - Errore al socket(): %ld\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
else
printf("Client: socket() e' OK.\n");



//---Connessione al server


struct sockaddr_in clientService;

clientService.sin_family = AF_INET;							//Famiglia protocollo TCP
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");		//Ip a cui si connette il client
clientService.sin_port = htons(55555);						//Porta aperta per la connessione al server

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
	{
		printf("Client: connessione() - Fallita la connessione.\n");
		WSACleanup();
		return 0;
	}

	
//---Invia e riceve dati


int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[1024] ;			
char recvbuf[1024] ;											


bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
printf("Client: send() - Bytes Inviati: %ld\n", bytesSent);

while(bytesRecv == SOCKET_ERROR)

    {
		bytesRecv = recv(m_socket, recvbuf, 32, 0);
		if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)

			{
				printf("Client: Chiusa Connessione.\n");
				break;

			}

        else
			printf("Client: recv() e' OK.\n");
			if (bytesRecv < 0)
			return 0;
			else
				{
					printf("Client: dati ricevuti sono \"%s\"\n", recvbuf);
					printf("Client: Bytes ricevuti - %ld.\n", bytesRecv);
				}
		}

bytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);
if (bytesSent == SOCKET_ERROR)
	printf("Client send() errore %ld \n", WSAGetLastError ());
else
	{
		printf ("Client: send () e' OK - Byte Inviati: %ld \n", bytesSent);
		printf("Client: La stringa di prova inviata: \"%s\"\n", sendbuf);
	}
	
	
	
FILE *fp;
char ch, *fbuff;
int indice, fileDim = 0;
bytesRecv = recv (m_socket, fbuff,strlen(fbuff), 0);
fp = fopen(files,"w");
fprintf(fp,"%s",files);
fclose;



WSACleanup();

	return 0;
}




Server:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "winsock2.h"

#define FILEs  "prova.txt"

int main()
{

//---Inizializza Winsock
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;					//Variabile che restituisce 1 se errore

wVersionRequested = MAKEWORD(2, 2);

wsaerr = WSAStartup(wVersionRequested, &wsaData);
if (wsaerr != 0) 
	{	
		printf("WinSock DLL non trovata \n");
		return 0;
	}
else
	{
		printf("Trovata Winsock DLL. \n");
		printf("Stato: %s.\n", wsaData.szSystemStatus);
	}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("La DLL non supporta la versione di Winsock %u. %u!\n", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
		WSACleanup();
		return 0;
	}

else
	{
		printf("La DLL supporta la version di Winsock %u.%u\n!", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
		printf("La versione piu alta che e' in grado di supportare questa DLL e': %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
	}


//--- Crea Socket
SOCKET m_socket;

m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (m_socket == INVALID_SOCKET)
	{
		printf("Errore al socket():%ld\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
else
	{
		printf("il Socket() e' OK!\n");
	}
	

	
//---Connessione al server
//creiamo l'oggetto sockaddr_in e settiamo il valore
struct sockaddr_in service;


service.sin_family=AF_INET;								//Famiglia di indirizzo internet
service.sin_addr.s_addr = inet_addr("127.0.0.1");	//Indirizzo IP della macchina
service.sin_port = htons(55555);						//Porta su quale connettersi

//Chiamiamo la funzione bind
if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
	{
		printf("bind() fallito: %ld.\n",WSAGetLastError());
		closesocket(m_socket);
		return 0;
	}
else
	{
		printf("bind() e' OK!\n");

	}
	
	/* Server In connession */
if (listen(m_socket, 1) == SOCKET_ERROR)
	printf("listen(): Errore socket listening %ld. \n", WSAGetLastError());
else
	{
		printf("listen() e' OK, Aspetto connessione....\n");
	}
SOCKET AcceptSocket;

printf("Server: Aspetta che il client si connetta....\n");
printf("***Hint; Server avviato...avvia il tuo client...***\n");

while (1)
	{

		AcceptSocket = SOCKET_ERROR;
			while (AcceptSocket == SOCKET_ERROR)
			{
				AcceptSocket = accept(m_socket, NULL, NULL);
			}

			//Altrimenti se accetta la connesione
			printf("Server: Client Connesso!\n");
			m_socket = AcceptSocket;
			break;
}

int BytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf [200];
char recvbuf [200] ; 


//Invia stringa al client
printf ("Server: L'invio di alcuni dati..\n");

BytesSent = send (m_socket, sendbuf, strlen (sendbuf), 0);

if (BytesSent == SOCKET_ERROR)
	printf("Server: send() errore %ld \n", WSAGetLastError ());
else
{
	printf ("Server: send () e' OK. \n");
	printf("Server: Byte Inviati: %ld \n", BytesSent);
}

//Riceve una stringa di prova dal cliente ... e cliente Deve inviare qualcosa lol ...
bytesRecv = recv (m_socket, recvbuf, 200, 0);

if (bytesRecv == SOCKET_ERROR)
	printf ("Server: recv() errore %ld \n", WSAGetLastError());
else
{
	printf ("Server: recv_() e' OK\n");
	printf ("Server: dati ricevuti sono \"%s\"\n", recvbuf);
	printf ("Server: Byte ricevuti: %ld \n", bytesRecv);
	
}
FILE *fp;
char ch, *fbuff;
int indice, fileDim = 0;
if((fp=fopen(FILEs,"r"))!=NULL)
{
//Si posizione alla ine del file
fseek(fp, 0, SEEK_END);
//Legge la posizione attuale
fileDim = ftell(fp);
//alloca la dimensione del buffer
fbuff = (char*)malloc(sizeof(char) * fileDim+1);
printf("Dimensione del file %s=%d\n",FILEs,fileDim);
//mi porto all'inizio del file
fseek(fp, 0, SEEK_SET);
//Copio il contenuto del file nel buffer
fread(fbuff, fileDim, 1, fp);
//invio il contenuto del buffer al client
BytesSent = send (m_socket,fbuff,strlen(fbuff),0);
if (BytesSent == SOCKET_ERROR)
	printf("Server: File non inviato \n", WSAGetLastError ());
else
{
	printf ("Server: File inviato \n");
	printf("Server: Byte Inviati: %ld \n", BytesSent);
}
}


WSACleanup();

return 0;




}


aaa