INADDR_ANY

 

Summry

네트워크 소켓 프로그래밍 시 INADDR_ANY의 의미

send me email if you have any questions.


INADDR_ANY 의미

INADDR_ANY는 자동으로 이 컴퓨터에 존재하는 랜카드 중 사용가능한 랜카드의 IP주소를 사용하라는 의미이다.

INADDR_ANY 사용 이유

예를들어 2개의 랜카드가 설치되어 있고 각각의 ip 주소가 192.168.0.1, 192.168.0.2 라 가정할 때 외부에서 192.168.0.1 로 데이터를 보내나 192.168.0.2 로 데이터를 보내나 내 컴퓨터로 오는건 같다. 하지만 프로그램에서 ip 주소를 192.168.0.1 로 등록했다면 192.168.0.2 로 들어오는 데이터는 수신하지 않는다.
즉, 같은 컴퓨터임에도 불구하고 ip 주소가 다르면 처리하지 않는다.

INADDR_ANY 를 사용하면 192.168.0.1 로 오는 데이터나 192.168.0.2 로 오는 데이터를 모두 처리한다. 즉 여러 ip주소에 들어오는 데이터를 모두 수신한다.

example

TCP Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUFF_SIZE 1024

int main(){
   int   server_socket;
   int   client_socket;
   int   client_addr_size;

   struct sockaddr_in   server_addr;
   struct sockaddr_in   client_addr;

   char   buff_rcv[BUFF_SIZE+5];
   char   buff_snd[BUFF_SIZE+5];

   server_socket  = socket(AF_INET, SOCK_STREAM, 0);
   if(-1 == server_socket)
   {
      printf( "server socket 생성 실패\n");
      exit(1);
   }

   memset(&server_addr, 0, sizeof( server_addr));
   server_addr.sin_family      = AF_INET;
   server_addr.sin_port        = htons( 4000);
   server_addr.sin_addr.s_addr = htonl( INADDR_ANY);    // 이부분!!

   if(-1 == bind( server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))){
      printf("bind() 실행 에러\n");
      exit(1);
   }

   if(-1 == listen(server_socket, 5))
   {
      printf("listen() 실행 실패\n");
      exit(1);
   }

   while(1)
   {
      client_addr_size  = sizeof(client_addr);
      client_socket     = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);

      if (-1 == client_socket)
      {
         printf("클라이언트 연결 수락 실패\n");
         exit(1);
      }

      read (client_socket, buff_rcv, BUFF_SIZE);
      printf("receive: %s\n", buff_rcv);
      
      sprintf(buff_snd, "%d : %s", strlen( buff_rcv), buff_rcv);
      write(client_socket, buff_snd, strlen( buff_snd)+1);          // +1: NULL까지 포함해서 전송
      close(client_socket);
   }
}

Reference

네트워크 소켓 프로그래밍 시 INADDR_ANY의 의미 - Grind away