1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programa socket

Discussão em 'Programação' iniciada por pedroxlima, 3 de Junho de 2009. (Respostas: 0; Visualizações: 594)

  1. Boas pessoal, é o seguinte eu tenho um trabalho da faculdade de programação em C pa entregar e já está quase ponto so que quando executo dame falha de segmentação.
    Objectivo do trabalho é ter um servidor e um cliente, como é logico e comunicar entre eles numa maquina local e utiliza se o tal programa dos carros que existe por aqui. Temos que introduzir o proprietario e a matricula de cada usuario

    código do servidor:

    #include <netinet/in.h>
    #include <unistd.h>
    #include <strings.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <arpa/inet.h>

    #define NAME_BUFFER_SIZE 80
    #define PORT 3000

    typedef struct {
    char matricula[6];
    char proprietario[NAME_BUFFER_SIZE];
    char apagado;
    } veiculo_t;

    int main(int argc, char *argv[])
    {
    struct sockaddr_in serv_addr, cli_addr;
    int op, n, i, sockfd, sockf, newsockfd;
    char mat[7];
    veiculo_t x;
    veiculo_t *ptr=NULL;
    FILE *dados, *sk;
    unsigned int clilen;

    if((dados=fopen("veiculos","r+b"))==NULL)
    printf("\n\nImpossível ler o ficheiro.\n\n");
    else
    {
    while((fread(&x,sizeof(x),1,dados))!=0)
    {
    if(x.apagado=='0')
    {
    if(n==0)
    {
    ptr=malloc(sizeof(x));
    n++;
    }
    else
    {
    ptr=realloc(ptr,(n+1)*sizeof(x));
    n++;
    }
    ptr[n-1]=x;
    }
    }
    printf("\n\nNúmero de registos:\t%d",n);
    }
    fclose(dados);


    sockfd = socket(PF_INET, SOCK_STREAM, 0);
    if(sockfd<0){
    perror("socket");
    exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(atoi(argv[1]));

    if(bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0){
    perror("bind");
    exit(1);
    }

    listen(sockfd,5);
    clilen = sizeof(cli_addr);
    while(1) {

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    sk= fdopen(sockf, "r+");

    if( (fread(&op,sizeof(int),1,sk) !=0) )
    {
    switch(op)
    {
    case 1:
    printf("\nProprietario:\t");
    gets(x.proprietario);
    printf("\nMatricula:\t");
    gets(mat);
    memcpy(x.matricula, mat, 6);
    x.apagado='0';
    if(n==0)
    {
    ptr=malloc(sizeof(veiculo_t));
    n++;
    }
    else
    {
    ptr=realloc(ptr,(n+1)*sizeof(veiculo_t));
    n++;
    }
    ptr[n-1]=x; //passa para a estrutura os dados introduzidos
    dados=fopen("veiculos","a+b");
    if(dados==NULL)
    printf("Ficheiro não encontrado ou impossível criar ficheiro.");
    else
    {
    fwrite(&x,sizeof(veiculo_t),1,dados); // escrita dos dados no ficheiro
    fclose(dados);
    }
    break;
    case 2:
    printf("\n\nTODOS OS REGISTOS:\n\n");
    for(i=0;i<n;i++)
    {
    if(ptr.apagado=='0')
    printf("Proprietário:\t%s\nMatrícula:\t%.6s\n\n",ptr.proprietario, ptr.matricula);
    }
    break;
    case 3:
    printf("\n\nMatrícula:");
    gets(mat);
    FILE *dados;
    if((dados=fopen("veiculos","wb"))==NULL)
    printf("\n\nImpossível ler o ficheiro.\n\n");
    else
    for(i=0;i<n;i++)
    {
    if (memcmp(ptr.matricula, mat, 6)==0)
    {
    if(ptr.apagado=='0')
    {
    ptr.apagado='1'; //apaga registo da memória
    x=ptr;
    fseek(dados,i*sizeof(veiculo_t),SEEK_CUR); /*Com o indicador na posição do registo introduzido, o registo é eliminado do ficheiro*/
    fwrite(&x,sizeof(veiculo_t),1,dados);
    printf("\n\nO registo foi apagado com sucesso.\n\n");
    }
    }
    else printf("\n\nRegisto não encontrado.\n\n");
    }
    fclose(dados);
    break;
    default: if(ptr!=NULL)
    free(ptr);
    break;
    }


    }

    }
    return 0;
    }


    codigo do cliente:

    #include <netinet/in.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>

    #define NAME_BUFFER_SIZE 80
    #define PORT 3000
    #define IP "localhost"

    typedef struct {
    char matricula[6];
    char proprietario[NAME_BUFFER_SIZE];
    char apagado;
    } veiculo_t;

    int main (int argc, char* const argv[])
    {
    struct sockaddr_in cliente_addr;
    struct hostent* hostinfo;
    int socket_fd;
    int sockf;
    int op;
    FILE *sk;

    cliente_addr.sin_family = AF_INET;
    hostinfo = gethostbyname (argv[2]);
    cliente_addr.sin_addr = *((struct in_addr *) hostinfo->h_addr);
    cliente_addr.sin_port = htons (atoi(argv[1]));

    socket_fd = socket (PF_INET, SOCK_STREAM, 0);
    if(socket_fd<0) {
    perror("socket");
    exit(1);
    }

    if(connect(socket_fd, (struct sockaddr *) &cliente_addr, sizeof (struct sockaddr_in))<0) {
    perror("connect");
    exit(1);
    }


    while(op!=4)
    {
    printf("\n\nESCOLHA UMA OPÇÃO:\n\n1. Inserir novo registo.\n2. Imprimir todos os registos.\n3. Apagar registos.\n4. Sair.\n\n");
    scanf("%d",&op);

    getchar();
    sk = fdopen (sockf,"r+");
    fwrite(&op,sizeof(int),1,sk);
    close(sockf);

    }


    return 0;
    }


    depois de compilado executo o servidor: ./serv 2048 localhost
    e de seguida o cliente: ./clie 2048

    apresenta me o menu e depois de introduzir um numero dame erro, se me puderem ajudar agradecia, pois n vejo o problema muito obrigado:004:
     

Partilhar esta Página