리눅스 소켓통신할때 자신이 직접 호스트의 네트워크 인터페이스를 바인딩 하는방법

jokercha의 이미지

제목 그대로

여러개의 네트워크 인터페이스를 갖는 리눅스 호스트에서 소켓통신할때

자신이 직접 통신에 사용될 호스트의 네트워크 인터페이스를 바인딩 하는방법이 있을까요????

gilgil의 이미지

pseudo code 참고하시기 바랍니다.

  // ------------------------------------------------------------------------
  // bind
  // ------------------------------------------------------------------------
  tcpSession->addr.sin_family = AF_INET;
  tcpSession->addr.sin_port = htons(quint16(localPort));
  if (localHost == 0)
  {
    tcpSession->addr.sin_addr.s_addr = INADDR_ANY;
  } else
  {
    IP ip = VNet::resolve(localHost);
    if (ip == 0)
    {
      SET_ERROR(VNetError, qformat("can not resolve host(%s)", qPrintable(localHost)), VERR_CAN_NOT_RESOLVE_HOST);
      return false;
    }
    tcpSession->addr.sin_addr.s_addr = htonl(ip);
  }
  memset(&tcpSession->addr.sin_zero, 0, sizeof(tcpSession->addr.sin_zero));
 
  int res = bind(tcpSession->handle, (SOCKADDR*)&tcpSession->addr, sizeof(tcpSession->addr));
  if (res == SOCKET_ERROR)
  {
    SET_ERROR(VSocketError, qformat("error in bind(%s:%d)", qPrintable(localHost), localPort), WSAGetLastError());
    return false;
  }
익명 사용자의 이미지

man 7 socket
보시면 SO_BINDTODEVICE 에 대한 설명이 있습니다.

전세계 수억명의 코더들 중에 유독 나 혼자만 이 문제로 고민하는 것이라고 생각되지 않는다면
검색부터.