Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mrsalomao

Enviando arquivo do Cliente para o Servidor

Recommended Posts

Ola pessoal!!! gostaria de saber de que forma posso enviar um arquivo utilizando o comando fopen() em um cliente para ser lido em um servidor.

 

Código Cliente

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ConnSocket.h"

#define MAX_MSG		1024			// Tamanho maximo da mensagem de comunicacao

//SOCKET conecta_servidor(char *, unsigned short);

void main(int argc, char **argv) {
	char Buffer[1024];  //Buffer utilizado para envio de mensagens
	char servidor [25]; //Nome do servidor ao qual será feita a conexão
	unsigned short porta;		 //Porta com a qual será feita a conexão
	int  retval = 1;	//Flag que controla o estado da comunicação

	SOCKET conn_socket; //Estrutura de Socket de conexão remota

	if (argc == 3) { //Se o programa foi chamado com 2 parâmetros: Servidor e Porta
		strcpy(servidor, argv[1]);
		porta = atoi(argv[2]);
	}
	else {
		strcpy(servidor, "127.0.0.1"); //Conecta a localhost
		porta = 5001;
	}

	//Conecta no servidor utilizando TCP (SOCK_STREAM);
	conn_socket = conecta_servidor(servidor, porta, SOCK_STREAM);

	if (conn_socket == SOCKET_ERROR) {
		fprintf(stderr,"Falha na Conexao: erro %d\n",WSAGetLastError());
			WSACleanup();
		//Nao permite entrar no loop de envio e recepcao
		retval = -1;
	}

	while(retval > 0) {

		printf("Qual a mensagem a enviar?\n");
		gets(Buffer);

		if (Buffer[0] == 'F') 
			break;

		//Envia mensagem ao servidor
		retval = send(conn_socket,Buffer, strlen(Buffer),0);
		//Se houve erro no envio da mensagem, imprime o erro
		if (retval == SOCKET_ERROR) {
			fprintf(stderr,"Falha no send(): erro %d\n",WSAGetLastError());
			WSACleanup();
		}
		else
		{
			printf("Dado Enviado: [%s]\n",Buffer);
			//Recebe dados do servidor
			retval = recv(conn_socket, Buffer, sizeof (Buffer),0 );

			Buffer[retval] ='\0';
			if (retval == SOCKET_ERROR) {
				fprintf(stderr,"Falha no recv() : erro %d\n",WSAGetLastError());
				closesocket(conn_socket);
				WSACleanup();
			}
			else 
			{
				if (retval == 0) {
					printf("Servidor fechou conexao\n");
					closesocket(conn_socket);
					WSACleanup();
				}
				else
					printf("Recebidos %d bytes, dados [%s] do servidor\n",retval,Buffer);
			}
		}

	}

	closesocket(conn_socket);
	WSACleanup();
}

 

Código Servidor

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ConnSocket.h"

int controla_conexoes(int);
void trataComandos(char * );
void ServerProc(SOCKET *);

#define MAX_MSG_LEN		1024		// Tamanho maximo da mensagem de comunicacao
#define NUM_CLI		 10			// Numero maximo de clientes ao server

int porta_livre;			
int retval;
int fromlen;
struct sockaddr_in from;

SOCKET listen_socket, conn_socket;
LONG		lpServerThreadID;
HANDLE	  mainThreadID;		 // ID da Thread principal

int main(int argc, char **argv) {
	unsigned short porta;		 //Porta com a qual será feita a conexão
	int  retval = 1;	//Flag que controla o estado da comunicação


	if (argc == 2) { //Se o programa foi chamado com 1 parâmetro: Porta
		porta = atoi(argv[2]);
	}
	else {
		porta = 5001;
	}

	listen_socket = cria_socket_escuta(porta, SOCK_STREAM);
	printf("\nAguardando conexoes na porta: %d\n", porta);

	controla_conexoes(porta);

	//mainThreadID = GetCurrentThread();

	//if (SuspendThread(mainThreadID) == -1) {
	//	printf("\nSuspendThread returns %d\n", GetLastError());
	//	ExitProcess(0);
	//}
}

//Controla o numero de clientes conectados
int controla_conexoes(int port) {
	while (TRUE)
	{
		if (listen(listen_socket,5) == SOCKET_ERROR) {
			printf("Erro no listen()  %d\n",WSAGetLastError());
			WSACleanup();
			return -1;
		}

		//printf("==>> 'Escutando' no port %d, protocol TCP \n",port);
		fromlen =sizeof(from);

		conn_socket = accept(listen_socket,(struct sockaddr*)&from, &fromlen);
		//printf("\n\n==>> Conexao aceita na porta %d... ", conn_socket);

		if (conn_socket == INVALID_SOCKET) 
		{
			printf("Erro no accept() %d\n",WSAGetLastError());
			WSACleanup();
			return -1;
		}

		printf("\n\n==>> Conexao aceita de Cliente %s, port %d\n", 
					inet_ntoa(from.sin_addr),
					htons(from.sin_port));

		// Criar Thread
		CreateThread ((LPSECURITY_ATTRIBUTES)NULL,	   // No security.
					 (DWORD)0,						  // Same stack size.
					 (LPTHREAD_START_ROUTINE)ServerProc,// Thread procedure.
					 (LPVOID) &conn_socket,						// Parameter.
					 (DWORD)0,						  // Start immediatly.
					 (LPDWORD)&lpServerThreadID);	   // Thread ID.
	}
}


//Funcão (THREAD) que troca dados com o cliente.
void ServerProc(SOCKET *socket){
	SOCKET sock = *socket;
	char Buffer[MAX_MSG_LEN];	// Buffer de comunicacao para troca de mensagens
	char c;

	while(1) {
		printf("\n-->> Recebendo dados ...\n");
		retval = recv(sock, Buffer, sizeof (Buffer),0 );
		Buffer[retval] = '\0';

		if (retval == SOCKET_ERROR) {
			fprintf(stderr,"Falha no recv() %d\n",WSAGetLastError());
			closesocket(sock);
			break;
		}

		if (retval == 0)  {
			printf("\n==>> Cliente fechou a Conexao ............. \n");
			closesocket(sock);
			break; //continue;
		}

		trataComandos(Buffer);

		printf("\n-->> Recebidos %d bytes, dados [%s] do cliente \n", retval,Buffer);
		strcat(Buffer, "  ::: do Servidor");

		//c = getchar();
		retval = send(sock,Buffer, strlen(Buffer),0);
		if (retval == SOCKET_ERROR) 
			{
				fprintf(stderr,"Falha no send()  %d\n",WSAGetLastError());
			}

	}
	printf("\nTerminando conexao\n\n");
	closesocket(sock);
	ExitThread(0);		
}



void trataComandos(char * s) {
	char comando[256];
	int i;

	STARTUPINFO si;	
	PROCESS_INFORMATION pi;
	if (s[0] == 'c') {
		for(i = 0; s[i] != '\0'; i++) {
			comando[i] = s[i+1];
		}
		ZeroMemory( &si, sizeof(si) );	
		si.cb = sizeof(si);
		if( !CreateProcess( NULL, comando, NULL,			 
			NULL, FALSE, CREATE_NEW_CONSOLE , NULL,
			NULL, &si, π ))			
			  printf( "%s\n", "CreateProcess failed." );
		else
			{
				WaitForSingleObject( pi.hProcess, INFINITE );
				CloseHandle( pi.hProcess );
				CloseHandle( pi.hThread );
			}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

(Não esqueça da tag [ code ] para postar códigos!!)

 

Cara, o comando fopen() é para abrir um arquivo...

pra você enviar esse arquivo, usa-se send()

 

ai você faz:

1. abrir arquivo
2. ler x bytes
3. se for o final do arquivo, ir para o passo 5
4. enviar x bytes
5. fechar o arquivo

para receber, é precisamente o contrário, você primeiro recebe os dados depois grava num arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.