使用微型http服务器c代码gcc debian编译错误

使用微型http服务器c代码gcc debian编译错误

我的发行版是 MX Linux (Debian) GCC 已经随发行版一起安装了。

我正在尝试编译 Nir ​​Lictman 的一些开源代码。他的极简 C Web 服务器代码在他的中编译Youtube 视频

当我使用gcc编译时,出现错误:

servera.c: In function ‘main’:
servera.c:21:13: warning: passing argument 2 of ‘bind’ from incompatible pointer type [-Wincompatible-pointer-types]
   21 |     bind(s, &addr, sizeof(addr));
      |             ^~~~~
      |             |
      |             struct sockaddr_in *
In file included from servera.c:1:
/usr/include/x86_64-linux-gnu/sys/socket.h:112:49: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
  112 | extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)

当我尝试查看 netinet 的手册页时,出现错误:

$ man netinet
No manual entry for netinet

我确实找到了一个netinet包含in.hat 的目录/usr/include/netinet。其in.h定义sockaddr_in如下:

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;         /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr)
               - __SOCKADDR_COMMON_SIZE
               - sizeof (in_port_t)
               - sizeof (struct in_addr)];
  };

不过我想知道编译器是否找到了这个定义。

答案1

请参阅中的示例man 2 bind:这里的标准做法是将指针强制转换为预期类型。在你的例子中:

    bind(s, (const struct sockaddr *) &addr, sizeof(addr));

相关内容