Проблемы при отладке программы с использованием сокетов в C: connect - PullRequest
0 голосов
/ 07 ноября 2010

Я пишу простую систему клиент-сервер с использованием сокетов Unix. При выполнении из терминала моя клиентская программа создает ошибку сегментации.

Я совершенно уверен, что ошибка seg вызвана некоторой ошибкой noob, но моя проблема возникает, когда я пытаюсь отладить его с помощью KDBG (внешний интерфейс kde gdb).

Вот где он ломается:

 if (DEBUG) printf("-- connect()... \n");
 if (connect (mySocket, (struct sockaddr *)socketAddr,sizeof (*socketAddr)) == -1) {
  perror(error);
  printf("%s\n",error);
  printf ("-- Error when stablishing a connection\n");
  return -1;
 }

И это вывод:

-- connect()... 
Connection refused

-- Error when stablishing a connection

Разве я не могу отлаживать этот код таким образом? Почему?

Если бы я мог, можете ли вы сейчас, что там происходит? Что я должен сделать, чтобы получить больше информации?

PS: PS: @abelenky: эта часть отлично работает из отладчика. Это объявление socketAddr:

struct sockaddr_in socketAddr; 

... 

if ( (mySocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    printf("Error al crear el socket\n"); 
    return -2; 
}

1 Ответ

0 голосов
/ 07 ноября 2010

Эти функции ожидают строку, а вы передаете им что-то еще.

Например:

perror("socket");

Хотя из вашего кода я не знаю, где объявлено error ... Возможно, вы думаете о глобальной переменной errno, которая является целым числом?

Кстати, perror примерно эквивалентно этому:

void perror(const char *str)
{
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
}

Обновление на основе комментариев:

В таком случае, я думаю, вы ничего не набрали error ни к чему ... Я не уверен, что вы ожидаете в error, но, например, вы можете попробовать что-то:

snprintf(error, sizeof(error), "Error in %s:%d\n", __FILE__, __LINE__);
perror(error);

Обновление 2:

Я думаю, вы хотите это:

if (connect (mySocket, (struct sockaddr *)&socketAddr, sizeof (socketAddr)) == -1) {

Обратите внимание, что я добавил & до socketAddr и удалил * из sizeof.

Как дела с поиском имени хоста? Я рекомендую getaddrinfo, например ::1010 *

struct addrinfo *res = NULL, hint;
char service[32];
int error;

snprintf(service, sizeof(service), "%d", port);

memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo(host, service, &hint, &res)))
{
   fprintf(stderr, "No se pudo encontrar %s: %s\n", host, gai_strerror(error));
}
else
{
   fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
   if (fd < 0)
   {
      perror("Error al crear el socket");
   }
   else if (connect(fd, res->ai_addr, res->ai_addrlen))
   {
      perror("Error al conexionar con el servidor");
      close(fd);
      fd = -1;
   }
}

if (res)
{
   freeaddrinfo(res);
}

Это позволит вам получить sockaddr от имени хоста и порта, не заботясь об IPv4, IPv6 и т. Д.

...