/* Programa de demonstração de uso de sockets UDP em C no linux * Funcionamento: * O servidor recebe uma palavra do cliente, concatena algo, e envia de volta. */ #include #include #include #include #include #include #include #include #define FALHA 1 #define TAM_MEU_BUFFER 1000 int cria_socket_local(void) { int socket_local; /* Socket usado nesta máquina */ socket_local = socket( AF_INET, SOCK_DGRAM, 0); if (socket_local < 0) { perror("socket"); exit(FALHA); } return socket_local; } void define_porta_escutada(int socket_local, int porta_escutada) { struct sockaddr_in servidor; /* Endereço completo do servidor e do cliente */ int tam_s; /* Tamanho da estrutura servidor */ memset((char *) &servidor, 0, sizeof(servidor)); servidor.sin_family = AF_INET; servidor.sin_addr.s_addr = htonl(INADDR_ANY); servidor.sin_port = htons(porta_escutada); tam_s = sizeof(servidor); if (bind(socket_local, (struct sockaddr *) &servidor, tam_s) < 0) { perror("bind"); exit(FALHA); } } int recebe_mensagem( char *buffer, int tam_buffer, int socket_local, struct sockaddr_in *endereco_cliente, int *tam_c) { int bytes_recebidos; /* Número de bytes recebidos */ memset( (char *)endereco_cliente, 0, sizeof(struct sockaddr_in)); endereco_cliente->sin_family = AF_INET; *tam_c = sizeof(struct sockaddr_in); bytes_recebidos = recvfrom(socket_local, buffer, tam_buffer, 0, (struct sockaddr *) endereco_cliente, tam_c); if (bytes_recebidos < 0) { perror("recvfrom"); exit(FALHA); } return bytes_recebidos; } void envia_mensagem(char *mensagem, int socket_local, struct sockaddr_in *endereco_cliente, int tam_c ) { if (sendto(socket_local, mensagem, strlen(mensagem)+1, 0, (struct sockaddr *) endereco_cliente, tam_c) < 0) { perror("sendto"); exit(FALHA); } } int main(int argc, char *argv[]) { int porta_escutada; if (argc < 2) { fprintf(stderr,"Uso: udpserver porta_escutada\n"); fprintf(stderr,"onde porta_escutada é um valor numérico entre 1025 e 65535\n"); exit(FALHA); } porta_escutada = atoi(argv[1]); int socket_local = cria_socket_local(); define_porta_escutada(socket_local, porta_escutada); int bytes_recebidos; char buffer[TAM_MEU_BUFFER]; struct sockaddr_in endereco_cliente; int tam_c; do{ bytes_recebidos = recebe_mensagem( buffer, TAM_MEU_BUFFER, socket_local, &endereco_cliente, &tam_c); printf("Adicionando 'ola tambem' na mensagem: %s\n", buffer); strcat( buffer, ", ola tambem\n"); envia_mensagem( buffer, socket_local, &endereco_cliente, tam_c); }while( 1 ); }