Проблема с IP-адресом в качестве позиционного аргумента - PullRequest
0 голосов
/ 10 марта 2020

Я хочу ввести IP-адрес и номер PORT в качестве позиционных аргументов. Вот так:

./client 127.0.0.1 12345

Они проходят, я проверяю, что они правильные (я решил это с помощью двух функций, аргументы которых я передал как char *), а затем я пытаюсь передать IP-адрес и номер PORT до двух переменных. sin_port принимает номер PORT в качестве значения, но s_addr не принимает IP-адрес (в принципе). Вот так:

int ret;
struct sockaddr_in servaddr;

servaddr.sin_addr.s_addr = inet_addr(argv[1]); //inet_addr accepts char*
servaddr.sin_port = htons (atoi(argv[2]));

// then

ret = connect (connSock, (struct sockaddr *) &servaddr, sizeof (servaddr));

И из-за connect () терминал ничего не делает.

Есть предложения?

Спасибо за ответы!


Редактировать:

Вот код моего клиентского модуля:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <errno.h>

// ./clientTest (távoli IP) (port)

#define MAX_BUFFER 1024
// #define MY_PORT_NUM 62324 /* This can be changed to suit the need and should be same in server and client */

int valid_digit(char *str)
{
    while (*str) {
        if (*str >= '0' && *str <= '9')
            ++str;
        else
            return 0;
    }
    return 1;
} // ha a string csak számokat tartalmaz, akkor a visszatérési érték TRUE, egyébként FALSE


int valid_ip(char *ip)
{
    int i, num, dots = 0;
    char *ptr;

    if (ip == NULL)
        return 0;

    ptr = strtok(ip, ".");

    if (ptr == NULL)
        return 0;

    while (ptr) {

        if (!valid_digit(ptr))
            return 0;

        num = atoi(ptr);

        if (num >= 0 && num <= 255) {
            ptr = strtok(NULL, ".");
            if (ptr != NULL)
                ++dots;
        } else
            return 0;
    }

    if (dots != 3)
        return 0;

    return 1;
}

int valid_port(char *port)
{

    int num;

    if (port == NULL)
    {
        return 0;
    }

    if (!valid_digit(port))
    {
        return 0;
    }

    num = atoi(port);

    if (num < 0 || num > 65535)
    {
        return 0;
    }
    return 1;
}

int
main (int argc, char* argv[])
{

  if (argc > 1)
  {
    if (!valid_ip(argv[1]))
    {
      printf("HIBA: A megadott IP cím hibás!\n");
      return 0;
    }
    if (!valid_port(argv[2]))
    {
      printf("HIBA: A megadott PORT szám hibás!\n");
      return 0;
    }
  }



  int connSock, in, i, ret, flags;

  struct sockaddr_in servaddr;
  struct sctp_status status;

  char buffer[MAX_BUFFER + 1];
  int datalen = 0;

  connSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP);

  if (connSock == -1)
  {
      printf("Socket creation failed\n");
      perror("socket()");
      exit(1);
  }

  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons (atoi(argv[2]));
  if (inet_aton(argv[1], &servaddr.sin_addr) != 1)
  {
    fputs("Invalid IP address", stderr);
    return 1;
  }

  if ((connect(connSock, (struct sockaddr *) &servaddr, sizeof (servaddr))) == -1)
  {
    perror("ERROR connecting");
    close(connSock);
    return 1;
  }
  else
  {
    ret = connect(connSock, (struct sockaddr *) &servaddr, sizeof (servaddr));
  }

  if (ret == -1)
  {
      printf("Connection failed\n");
      perror("connect()");
      close(connSock);
      exit(1);
  }

  printf("Enter data to send: ");
  fgets(buffer, MAX_BUFFER, stdin);

  buffer[strcspn(buffer, "\r\n")] = 0;
  datalen = strlen(buffer);

  ret = sctp_sendmsg (connSock, (void *) buffer, (size_t) datalen,
        NULL, 0, 0, 0, 0, 0, 0);
  if(ret == -1 )
  {
    printf("Error in sctp_sendmsg\n");
    perror("sctp_sendmsg()");
  }
  else
      printf("Successfully sent %d bytes data to server\n", ret);

  close (connSock);

  return 0;
}

Я сделал вывод из информации, предоставленной Wireshark: похоже, аргумент IP-адреса не передать правильно в программу. Из Wireshark:

09 39.287070587 192.168.0.104 0.0.0.127 SCTP 82 INIT 3

Где 0.0.0.127 - IP-адрес назначения.

Если вам нужен код моего сервера, сообщите мне.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы должны установить sin_family, то есть:

servaddr.sin_family = AF_INET;

Кроме того, используйте inet_aton вместо inet_addr, поскольку это позволяет правильно обрабатывать ошибки:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>

int main (int argc, char* argv []) {
    if (argc < 3) {
        fprintf (stderr, "Usage: %s HOST PORT\n", argv [0]);
        return 1;
    }

    int connSock = socket(AF_INET, SOCK_STREAM, 0);
    if (connSock == -1) {
        perror ("Error creating TCP socket");
        return 1;
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;

    if(inet_aton(argv[1], &servaddr.sin_addr) != 1) {
        fputs ("Invalid IP address", stderr);
        return 1;
    }
    servaddr.sin_port = htons (atoi(argv[2]));

    if (connect (connSock, (struct sockaddr *) &servaddr, sizeof (servaddr)) == -1) {
        perror ("Error connecting");
        close (connSock);
        return 1;
    }

    puts ("Connection successful.");

    close (connSock);
    return 0;
}
0 голосов
/ 11 марта 2020

Ваша valid_ip() функция изменяет argv[1], так что «127.0.0.1» становится «127»:

    ptr = strtok(ip, ".");

Используйте прототип с модификаторами const (например, int valid_port(char const *port)) и реализуйте его чтобы он без ошибок компилировался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...