Olá pessoal, prazer, me chamo Marina (primeiro tópico hauhauahu), enfim, estou com um trabalho da faculdade que preciso entregar onde o professor pediu que fizessemos um cliente/servidor em UDP. O cliente entra com um código, precisa abrir um arquivo .dat para pegar os ip's e portas de servidores listados para tentar a conexão, e enviar esses dados ao servidor, que vai recebe-lo e reenviar para os outros servidores a mesma mensagem, fiz os códigos abaixo depois de muita pesquisa na net:
clientudp.c
Na hora que entro com o código, dá erro de Segmentação, não faço ideia do que possa ser. O arquivo abaixo são os endereços que ele precisa testar na hora da conexão, mas não sei se está abrindo ou não o arquivo pois o erro ocorre antes.Código :#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> main(int argc, char ** argv) { struct sockaddr_in scheduller; int s, sched_address_size; char buf; char ip[16]; int port[6]; if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket()"); exit(1); } printf("\n\nMenu\n"); printf("-----------------------------------------\n"); printf("Para incluir digite (I): "); printf("\nPara alterar digite (A): "); printf("\nPara excluir digite (E): "); printf("\nPara consultar digite (C): "); printf("\n"); gets(buf); FILE * fp; if (fp=fopen("config.dat","r") != NULL) { while(fscanf(fp, "%s %i", ip, port) != NULL) { scheduller.sin_family = AF_INET; scheduller.sin_addr.s_addr = inet_addr(ip); scheduller.sin_port = htons(port); if (sendto(s, buf, (strlen(buf)+1), 0, (struct sockaddr *)&scheduller, sizeof(scheduller)) < 0) { perror("A mensagem não pode ser enviada"); exit(2); } else { sendto(s, buf, (strlen(buf)+1), 0, (struct sockaddr *)&scheduller, sizeof(scheduller)); break; } } sched_address_size = sizeof(scheduller); if(recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &scheduller, &sched_address_size) <0) { perror("Erro ao receber a resposta"); exit(4); } printf("%s\n", buf); fflush(stdout); } else printf("Nao foi possivel se conectar ao servidor, tente mais tarde"); fclose(fp); close(s); }
config.dat
Vou postar o código do servidor também apesar dele ainda só estar recebendo a mensagem e mandando a resposta, sem reenviar para os demais servidores.Código :127.0.0.1 7001 127.0.0.1 7002 127.0.0.1 7003
servidorudp.c
Bom é isso, se alguém puder me explicar onde estou errando (acho que estou errando em tudo, mas beleza), eu agradeceria muito.Código :#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> main(int argc, char ** argv) { int sockint,s; socklen_t namelen; socklen_t client_address_size; struct sockaddr_in client, scheduller; char buf; if (argc < 2) { perror("Quantidade de parametros incorreta!"); printf("\n%s [port]\n",argv[0]); exit(1); } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket()"); exit(1); } scheduller.sin_family = AF_INET; scheduller.sin_port = htons(atoi(argv[1])); scheduller.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr *)&scheduller, sizeof(scheduller)) < 0) { perror("bind()"); exit(2); } namelen = sizeof(scheduller); if (getsockname(s, (struct sockaddr *) &scheduller, &namelen) < 0) { perror("getsockname()"); exit(3); } fflush(stdout); client_address_size = sizeof(client); if(recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &client, &client_address_size) <0) { perror("recvfrom()"); exit(4); } fflush(stdout); printf("Protocolo: %s\n", buf); strcpy(buf, "Mensagem recebida"); if(sendto(s, buf, (strlen(buf)+1), 0, (struct sockaddr *) &client,sizeof(client)) <0) { perror("recvfrom()"); exit(4); } close(s); }
Até!