Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @file server.c
- * @brief Description
- * @date 2017-10-29
- * @author name of author
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include <signal.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <assert.h>
- #include <time.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #include "debug.h"
- #include "memory.h"
- #include "common.h"
- #include "server_args.h"
- #define MAX_PORT (1 << 16)
- int setup_server(int port, int type, int backlog);
- int validate_port_number(int port);
- int main(int argc, char *argv[])
- {
- struct gengetopt_args_info args;
- // gengetopt parser: deve ser a primeira linha de código no main
- if( cmdline_parser(argc, argv, &args) ){
- ERROR(1, "Erro: execução de cmdline_parser\n");
- }
- int port = validate_port_number(args.port_arg);
- int backlog = 0;
- int sock = setup_server(port, SOCK_DGRAM, backlog);
- close(sock);
- // gengetopt: libertar recurso
- cmdline_parser_free(&args);
- return 0;
- }
- int validate_port_number(int port){
- if( port < 0 || port >= MAX_PORT ){ // antes estava >
- fprintf(stderr,"invalid port number (%d)\n", port);
- exit(5);
- }
- return port;
- }
- /* @return socket already binded locally */
- int setup_server(int port, int type, int backlog){
- assert( port > 0 || port < MAX_PORT );
- assert(type==SOCK_DGRAM || type==SOCK_STREAM);
- assert( (type==SOCK_STREAM && backlog > 0) || (type==SOCK_DGRAM));
- int sock = socket(AF_INET, type, 0);
- if( sock == -1 ){
- ERROR(1,"Cannot create socket");
- }
- struct sockaddr_in my_addr;
- memset(&my_addr,0,sizeof(my_addr));
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(port);
- my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- int ret_bind=bind(sock,(struct sockaddr*)&my_addr,sizeof(my_addr));
- if( ret_bind == -1 ){
- ERROR(2,"Cannot bind socket (port=%d)\n", port);
- }
- if( type == SOCK_STREAM ){
- int ret_listen = listen(sock, backlog);
- if( ret_listen == -1 ){
- ERROR(3,"Cannot listen");
- }
- }
- printf("[SERVER] bind port %d\n", port);
- return sock;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement