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

Psicopunk

Duvida: Sockets

6 mensagens neste tópico

Viva,

Estou a tentar passar o conteúdo dum ficheiro .xml dum pc para o outro usando Sockets. No entanto, ao receber o conteúdo, algo não corre bem.

Servidor

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>



int main ( int agrc, char *argv[] )

{

/******** Program Variable Define & Initialize **********/

int Main_Socket; 	// Main Socket For Server

int Communication_Socket; // Socket For Special Clients

int Status; // Status Of Fucntion

struct sockaddr_in Server_Address; // Address Of Server

struct sockaddr_in Client_Address; // Address Of Client That Communicate Whit Server

int Port ;

        char Buff[100] = "";

Port = atoi(argv[2]);

printf ("Server Communicating By Using Port %d\n", Port);

/******** Create A Socket To Communicate With Server **********/

Main_Socket = socket ( AF_INET, SOCK_STREAM, 0 );

if ( Main_Socket == -1 )

{

	printf ("Sorry System Can Not Create Socket!\n");

}

/******** Create A Address For Server To Communicate **********/

Server_Address.sin_family = AF_INET;

Server_Address.sin_port = htons(Port);

Server_Address.sin_addr.s_addr = inet_addr(argv[1]);

/******** Bind Address To Socket **********/

Status = bind ( Main_Socket, (struct sockaddr*)&Server_Address, sizeof(Server_Address) );

if ( Status == -1 )

{

	printf ("Sorry System Can Not Bind Address to The Socket!\n");

}

/******** Listen To The Port to Any Connection **********/        

listen (Main_Socket,12);	

socklen_t Lenght = sizeof (Client_Address);
printf ("À espera de conexoes\n");

char temp_buffer[100];
char Buffer[2];


        while (1)

        {

            Communication_Socket = accept ( Main_Socket, (struct sockaddr*)&Client_Address, &Lenght );

            if (!fork())

            {

                while(1)

                {

                    if (recv(Communication_Socket, Buffer, sizeof(Buffer), 0))

                    {
		printf(" Buffer = %s FIm Buffer\n",Buffer);			


                        if ( strcmp (Buffer,"Hi") == 0  )

                        {
		printf("vou sair\n");
			printf("\ntemp_buffer = %s\n",temp_buffer);
		exit(0);

                        break;

                        }

                        else

                        {
		printf("Concatenar\n");
		strncat(temp_buffer,Buffer,2);
                        }

                    }

                }

                printf("ACK Send");

	exit(0);

            }

        }

return 0;

}

CLIENTE



#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>



int main ( int agrc, char *argv[] )

{

int Socket;

struct sockaddr_in Server_Address;	

Socket = socket ( AF_INET, SOCK_STREAM, 0 );

if ( Socket == -1 )

{	

	printf ("Can Not Create A Socket!");	

}

int Port ;

Port = atoi(argv[2]);	

Server_Address.sin_family = AF_INET;

Server_Address.sin_port = htons ( Port );

Server_Address.sin_addr.s_addr = inet_addr(argv[1]);

if ( Server_Address.sin_addr.s_addr == INADDR_NONE )

{

	printf ( "Bad Address!" );

}	
printf ("Tentativa de connect()\n");

connect ( Socket, (struct sockaddr *)&Server_Address, sizeof (Server_Address) );





FILE *in = fopen("/home/vigie/Desktop/Testes/tv_example.xml","r"); 
       char Buffer[2] = "";

        int len;

printf ("Tentativa de read()\n");


        while ((len = fread(Buffer,sizeof(Buffer),1, in)) > 0)

        {            

            send(Socket,Buffer,sizeof(Buffer),0);
	                      

        }

        send(Socket,"Hi",sizeof(Buffer),0);

       

        close (Socket);

        fclose(in);

return 0;	

}

O ficheiro XML tem como conteúdo:

<?xml version="1.0"?>

<TV>
  <channel number="1">
    <name>BBC</name>
    <logo>/var/lib/mythtv/pictures/tv/bbc.png</logo>
    <url>/home/rcs/video.mp4</url>
    <nationality>United Kingdom</nationality>
    <description></description>
  </channel>
</TV>

Acontece que à medida que recebo o conteúdo do ficheiro XML, o Buffer vai ficando com lixo.

Quando printo o conteúdo do Buffer no fim, obtenho:

Buffer = Hi<?xml version="1.0"?>

<TV>

  <channel number="1">

    <name>BBC</name>

    <logo>/var/lib/mythtv/pictures/tv/bbc.png</logo>

    <url>/home/rcs/video.mp4</url>

    <nationality>United Kingdom</nationality>

    <description></description>

  </channel>

</TV> FIm Buffer

Alguém compreende o que está a acontecer? tenho tentado mudar o código a ver se entendo o problema, mas não encontro nada que faça sentido.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
send(Socket,"Hi",sizeof(Buffer),0);

não faças isso, faz antes

char* str = "Hi";
send(Socket,str,(int)strlen(str),0);

e experimenta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva,

experimentei agora mesmo e continua igual... Não estou a ver o que causa isto...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo muito de C, mas é capaz de ser o \0 no final da string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que percebi tu queres transferir um XML de um pc para outro não é?

Não percebi é qual é o "lixo".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente.

O lixo é que quando eu printo o conteúdo que está a receber o XML, em vez de aparecer somente 2 caracteres (tamanho do Buffer) aparece o conteúdo total do  XML...

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