• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

afroman110

server client sockets com ficheiros..

14 mensagens neste tópico

boas.. :)

preciso de um servidor e de um cliente tcp em linguagem c, nos quais o cliente envia o conteudo de um ficheiro de texto para o servidor e o servidor cria um ficheiro igual ao do cliente..

com aquilo que tenho, ja tenho o cliente a mandar mensagem escritas no teclado para o servidor, mas a manipulacao de ficheiros em c é que me "parte todo"...  :down:

se for possivel enviar-me os ficheiros .c para o mail era de sonho..

desde já obrigado e ainda fico mais agradecido se for ainda hoje..

edit:

boa cena.. nem me tinha lembrado disso..

a minha duvida é na manipulacao de ficheiros:

qual ou quais as bibliotecas (ou livrarias como queiram) que é preciso carregar?

como se le o fich linha a linha?

como se escreve no fich linha a linha?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta colocares as tuas dúvidas concretas aqui, pode ser que alguém te ajude :)

Já agora, expores assim o teu email só vai facilitar o trabalho aos bots de spam..., este quadro está visível a guests, portanto é fácil roubarem-te o mail...

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este é o meu cliente..

o que é que ta mal aqui??

ja tou a chatear-me com isto, mas nem isso resulta..

#include <sys/types.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>


int read_linha(int s, char *b, int m)
{
int i;
for(i=0;i<m;i++)
{
        /* ler um caractere */
	if(read(s,&b[i],1)!=1) 
		return(-1);
	/* fim da linha */
	if(b[i]=='\n') 
	{
		b[i]=0; 
		return(i);
	}
	/* ignorar o \r do DOS-WINDOWS */
	if(b[i]=='\r') 
		i--;
}
b[i]=0; 
return(-1);
}


int main()
{
FILE *fp1;
struct sockaddr_in me, server;
struct hostent *var;
int sock=socket(AF_INET,SOCK_STREAM,0);
int adl=sizeof(me);
int try, retrys=5, timeout=1, ok, ready;
char linha[80]="Inicio";
struct timespec tt;
fd_set fds;
bzero((char *)&me,adl);
me.sin_family=AF_INET;
me.sin_addr.s_addr=htonl(INADDR_ANY); /* endereco IP local */
me.sin_port=htons(0); /* porta local (0=auto assign) */
bind(sock,(struct sockaddr *)&me,adl);
bzero((char *)&server,adl);
server.sin_family=AF_INET;
/* endereco IP de destino */
printf("Qual o nome do servidor?");
scanf("%s%",linha);
var=gethostbyname(linha);
server.sin_addr=*(struct in_addr*)*var->h_addr_list;
server.sin_port=htons(8450); /* porta do servidor */
if(-1==connect(sock,(struct sockaddr*)&server,sizeof(server)))
{
	printf("Erro no connect\n");
	exit(-1);
}
else
{
//	FILE *fp1;
	printf("Nome completo do ficheiro: ");
	gets(linha);
	fp1 = fopen(linha,"r");
	if(fp1 == NULL)
	{
		printf("ERRO ao abrir ficheiro ou ficheiro inexistente");
	}
	else
	{
		do
		{	
			read_linha(sock,linha,80);	
	   		try=retrys;
   				ok=0;
			while(try && !ok)
      				{
      					write(sock,linha,81);
      					FD_ZERO(&fds);
    		  			FD_SET(sock,&fds);
      					tt.tv_sec=timeout;
      				tt.tv_nsec=0;
      					ready=select(sock+1,&fds,0,0,&tt);
      					if(ready<0)
 					perror("Select");
      					else
         				{
         					if(ready && FD_ISSET(sock,&fds))
           				{
            						if(read(sock,linha,81)!=-1) 
							ok=1;
            						try--;
            						if(ok) 
							puts(linha); 
						else 
							puts("No reply from server");
      	      					}
         				}
      				}
		} while ( !fp1.EOF ) ;
	}	
/*   	{
   		printf("Escreva a mensagem a enviar: ");
   		gets(linha);
   		try=retrys;
   		ok=0;
   		while(try && !ok)
      			{
      			write(sock,linha,81);
      			FD_ZERO(&fds);
      			FD_SET(sock,&fds);
      			tt.tv_sec=timeout;
      			tt.tv_nsec=0;
      			ready=select(sock+1,&fds,0,0,&tt);
      			if(ready<0)
 			perror("Select");
      			else
         			{
         			if(ready && FD_ISSET(sock,&fds))
            			{
            				if(read(sock,linha,81)!=-1) ok=1;
            					{
            					try--;
            					}
            				if(ok) puts(linha); else puts("No reply from server");
            				}
         			}
      			}
   		}
while(strcmp(linha,"EXIT"));*/
}
close(sock);
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O ano passado fiz um exercicio semelhante.

Deixo-te aqui o código do cliente e servidor, em que o cliente envia um ficheiro de texto para o servidor.

CLIENTE:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

main()
{
FILE *fp;
FILE *fp1;
struct sockaddr_in me, from;
int newSock, sock = socket(AF_INET,SOCK_STREAM,0);
int ad1 = sizeof(me);
char ip[15];
u_short porto=0;
char linha[81], linha2[81];
char f[500];
bzero((char *)&me,ad1);
me.sin_family=AF_INET;
me.sin_addr.s_addr=inet_addr("127.0.0.1");
me.sin_port=htons(1099);

if(bind(sock,(struct sockaddr *)&me,ad1)==-1)
{
	close(sock);
	puts("Porta Ocupada!!");
	exit(0);
}

listen(sock,5);
newSock=accept(sock,(struct sockaddr *)&from,(void *)&ad1);
close(sock);

do{
	read(newSock,linha, 81);
	if(strcmp(linha,"disconnect")==0){exit(0);}
	puts(linha);
	strcpy(ip,inet_ntoa(from.sin_addr));
	porto=from.sin_port;
	printf("(Cliente: %s  Porto: %d)\n", ip, porto);
	if(strcmp(linha,"ls")==0)
	{
		system("ls>dir.txt");
		strcpy(linha,"INIT_LS");
		write(newSock,linha,81);

		fp=fopen("dir.txt","r");

		if(fp==NULL)
		{
			puts("\n\nErro!!");
			exit(0);
		}

		while(fgets(linha,81,fp)!=0)
		{
			write(newSock,linha,81);
		}

		write(newSock,"END_LS",81);
		fclose(fp);
	}
	else{
		read(newSock,linha, 81);
		puts(linha);

		write(newSock,"INIT_VI",81);

		fp1=fopen(linha,"r");

		if(fp1==NULL)
		{
			puts("\n\nErro!!");
			exit(1);
		}

		while(fgets(linha,81, fp1)!=0)
		{
			write(newSock,linha,81);
		}
		write(newSock,"END_VI",81);
	}
}while(strcmp(linha,"exit"));
close(sock);
}

SERVIDOR:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

main()
{
FILE *fp;
struct sockaddr_in target;
int sock = socket(AF_INET,SOCK_STREAM,0);
int ad1 = sizeof(target);
char linha[81];

bzero((char *)&target,sizeof(target));

target.sin_family=AF_INET;
target.sin_addr.s_addr=inet_addr("127.0.0.1");
target.sin_port=htons(1099);

if(connect(sock,(struct sockaddr *)&target,ad1)==-1)
{
	puts("Connect Failed!");
	exit(0);
}

int op=0;
do{
	puts("\n\n1 - Listar Ficheiros");
	puts("\n\n2 - Ver Ficheiro");
	puts("\n\n3 - DISCONNECT");
	puts("\n\n0 - Sair");
	printf("\n\nIntroduza a opcao: ");
	scanf("%d",&op);

	switch(op)
	{
		case 1:
			strcpy(linha,"ls");
			write(sock,linha,81);
			while(strcmp(linha,"END_LS")!=0)
			{
				read(sock,linha,81);
				puts(linha);
			}
			break;

		case 2:
			getchar();
			write(sock,"VIEW",81);
			puts("\n\nInsira nome do ficheiro: ");
			scanf("%s",linha);
			write(sock,linha,81);
			read(sock,linha,81);
			puts(linha);puts("\n");
			fp=fopen("recebido.txt","a+");
			while(strcmp(linha,"END_VI")!=0)
			{
				read(sock,linha,81);
				fputs(linha,fp);
			}
			break;

		case 3:
			write(sock,"disconnect",81);
			break;
	}
}while(op!=0);
close(sock);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado.. :)

:)

edit:

:hmm:

as cenas estao trocadas,

o server ta no sitio do cli e o cli no sitio do server...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

basicamente sao duas aplicações, uma de servidor e outra de cliente em que poes a correr o server numa maquina, depois ligando um cliente (na mesma maquina ou noutra) e dando-lhe o ip do server, pode enviar um ficheiro de texto linha a linha para o servidor..

nao sei se me fiz entender  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim... mas, tava a tentar por prog a "funkar" :cheesygrin: e não conseguia...

Simplesmente fiz um copy paste o server para um ficheiro.c  o cliente para outro e dame erro... como é que eu posso exprimentar sem tar a ligar 2 PC ?? é que eu sei que atravez deste ip 127.0.0.1 posso fazer do meu  pc o server e o cliente :P. mas nao deve ser só copy paste e compilar ? pois nao ???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dá em UNIX/Linux...

Em Windows isso não funciona.

E não, não tem erros... Quanto mais alguns warnings quando compilado com o -wall. :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basta só compilar com o gcc ??

Claro, ia ser com o quê? :(

gcc cliente.c -o cliente
gcc servidor.c -o servidor
./servidor
./cliente
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sei la podia ser necessário fazer alguma coisa....

do tipo ... instalar o linux 1º LLLLLLLLLOOOOOOOOOOLLLLLLLLLLLLL :(:P:P:P:P

LOOOL

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dá em UNIX/Linux...

E olhando para alguns dos includes, chegavas lá :(

HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora