内核空间套接字连接超时

3

再次向您寻求帮助,我的内核模块需要翻译。我已经实现了一个客户端模块,但每次连接函数返回errno=110(超时)。我不明白为什么?为了测试这个模块,我启动了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是“超时”。


你在另一端有什么在听呢?它是否正在接受传入的电话呢? - Klas Lindbäck
是的,我已经尝试过使用nc -lv -p4242以及另一个内核模块设置为服务器模式。 - 0xBAADF00D
NB!你一定要检查sock_create()的返回结果。 - red0ct
1个回答

5

in_aton("127.0.0.1"); 已经返回网络字节序的地址。

通过执行 htonl(in_aton("127.0.0.1"));,您实际上正在尝试连接到 1.0.0.127。


htonl函数允许代码在小端和大端架构上都能正常工作。因此,使用htonl(in_aton("127.0.0.1"))可以得到0x7F000001,而不使用htonl()则会得到0x100007F。我尝试了你的建议,它很有效 :-) - 0xBAADF00D
没错!网络字节顺序是大端序,但x86处理器使用小端序。很高兴我能帮到你 :) - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接