Тайм-аут подключения сокета земли ядра - PullRequest
3 голосов
/ 19 июня 2011

еще раз, мне нужна ваша помощь для моего модуля ядра. Я реализовал клиентский модуль, но каждый раз, функция подключения возвращает errno = 110 (Timeout). Я не понимаю почему? Чтобы проверить этот модуль, я запустил netcat в режиме прослушивания (nc -vl -p4242). Есть ли у вас какие-либо предложения по поводу этой мистической ошибки

int             init_module(void)
{
  struct socket*        sock = NULL;
  struct sockaddr_in*   dest = {0};
  int                   retVal = 0;

  dest = (struct sockaddr_in*)kmalloc(sizeof(struct sockaddr_in), GFP_KERNEL);
  sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
  dest->sin_family = AF_INET;
  dest->sin_addr.s_addr = htonl(in_aton("127.0.0.1"));
  dest->sin_port = htons(4242);
  printk(KERN_EMERG "Connect to %X:%u\n", dest->sin_addr.s_addr, 4242);

  retVal = sock->ops->connect(sock, (struct sockaddr*)dest, sizeof(struct sockaddr_in), !O_NONBLOCK);
  if (retVal >= 0) {
    printk(KERN_EMERG "Connected\n");
    sock_release(sock);
  }
  else
    printk(KERN_EMERG "Error %d\n", -retVal);

  return (0);
}

Вывод отладки (dmesg)

Message from syslogd@century at Sun Jun 19 08:41:33 2011 ...
century kernel: Connect to 7F000001:4242

Message from syslogd@century at Sun Jun 19 08:41:54 2011 ...
century kernel: Error 110

Код ошибки 110: «Тайм-аут».

1 Ответ

5 голосов
/ 20 июня 2011

in_aton("127.0.0.1"); уже дает адрес в сетевом порядке байтов.

Делая htonl(in_aton("127.0.0.1"));, вы фактически пытаетесь подключиться к 1.0.0.127

...