mrsalomao 0 Denunciar post Postado Abril 6, 2009 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
VictorCacciari 42 Denunciar post Postado Abril 6, 2009 (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