마이크로 http 서버 C 코드 사용 gcc 데비안 컴파일 오류

마이크로 http 서버 C 코드 사용 gcc 데비안 컴파일 오류

내 배포판은 MX입니다. Linux(Debian) GCC는 이미 배포판과 함께 설치되어 있습니다.

Nir Lictman의 일부 오픈 소스 코드를 컴파일하려고 합니다. 그의미니멀리스트 C 웹 서버코드는 그의유튜브 영상.

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

at이 netinet포함된 디렉토리를 찾았습니다 . 그 정의 는 다음과 같습니다:in.h/usr/include/netinetin.hsockaddr_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));

관련 정보