Pat
Pat

Reputation: 69

C sockets - network is unreachable when using arguments

I'm trying to implement a client/server program using sockets. When I use default parameters for address and port, it works fine. But when I try to set them using main arguments, the client returns "network is unreachable". How can I fix it?

client.c

int main(int argc , char *argv[]) {
int sock, opcao;
struct sockaddr_in server;
char message[MAX_BUFFER] , server_reply[MAX_BUFFER], lista[MAX_BUFFER];

//Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
    printf("Could not create socket");
}
//puts("Socket created");

server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
server.sin_port = htons( 8888 );

if (argc > 2) {
    server.sin_addr.s_addr = inet_addr(argv[1]);
    server.sin_port = htons(atoi(argv[2]));
}

//Connect to remote server

if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
{
    perror("connect failed. Error");
    return 1;
}

server.c

#include <stdio.h>
#include <string.h>   //strlen
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>   //close
#include <arpa/inet.h>    //close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h> //FD_SET, FD_ISSET, FD_ZERO macros

#define TRUE   1
#define FALSE  0
#define PORT 8888
#define MAX_CONNECTIONS 3

typedef struct TipoCliente {
    int socket;
    char apelido[100];
    char ip[20];
    int porta;
    int status;
} TipoCliente;

int main(int argc , char *argv[]) {
    int opt = TRUE;
    int master_socket, addrlen, new_socket, max_clients = MAX_CONNECTIONS, activity, i, j, valread, sd;
    TipoCliente clientes[MAX_CONNECTIONS];
    int max_sd;
    char *message = (char *)malloc(1025 * sizeof(char));
    struct sockaddr_in address;
    char EOS = '\0';
    char *primeiroN;
    char buffer[1025], aux[1025];  //data buffer of 1K

    //set of socket descriptors
    fd_set readfds;

    //a message
    strcpy(message, "Bem-vindo ao chat! O que voce deseja fazer?\n\n1. Solicitar inscricao no chat\n2. Atualizar seu status\n3. Receber lista de usuarios disponiveis\n4. Cancelar inscricao no chat\n");

    //initialise all client_socket[] to 0 so not checked
    for (i = 0; i < max_clients; i++)
    {
        clientes[i].socket = 0;
    }

    //create a master socket
    if( (master_socket = socket(PF_INET , SOCK_STREAM , 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    //set master socket to allow multiple connections , this is just a good habit, it will work without this
    if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 )
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

   //valores default para o servidor
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(PORT);

   if (argc > 1) {
       address.sin_port = htons(atoi(argv[1]));
   }
   printf("Listener on port %d \n", address.sin_port);

On command line I'm using:

client: ./client localhost 8888

server: ./server 8888

Upvotes: 1

Views: 7271

Answers (1)

Pat
Pat

Reputation: 69

As many users posted, my error was on client parameters. Replacing localhost by an IP address, such as 127.0.0.1, it works.

Upvotes: 1

Related Questions