2012-03-15 2 views
2

Winsock을 사용하여 TCP 서버 응용 프로그램을 작성하고 있습니다. 내 서버가 실행될 머신과 클라이언트가 실행될 머신은 2 개의 NIC를 가지고 있습니다. 관련된 IP 주소는 다음과 같습니다여러 개의 NIC가 관련된 경우의 IP 주소

  • 서버 NIC 1 : 192.168.132.14 < - 이것은 내가 바인딩 할 일이
  • 서버 NIC 2 : 192.168.132.15
  • 클라이언트 NIC 1 : 192.168.132.16
  • 클라이언트 NIC 2 을 : 192.168.132.17

질문 1 : 내 청취 소켓을 바인딩 할 때 나는 INADDR_ANY를 사용하는 경우 내 서버 응용 프로그램에서 , 내 두 개의 IP 주소 중 어느 것이 사용됩니까? 나는 말할 것도없고 INADDR_ANY 대신에 inet_addr ("192.168.132.14")을 사용해야한다고 가정하는 것이 옳은가?

질문 2 : 나와 연결할 때 클라이언트가 사용하는 IP 주소를 어떻게 제어 할 수 있습니까? connect()를 호출하기 전에 간단히 bind()를 호출할까요? 나는 그가 어느 쪽의 주소 (아무도 말하지 않고)에서 연결하는 것을보아야한다.

+0

INADDR_ANY는 두 NIC에 모두 바인딩되므로 다른 IP의 동일한 포트에 이미 수신중인 다른 소켓이 없으면 INADDR_ANY 소스를 사용할 수 있습니다. http : http : //www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html – SupremeDud

답변

7

서버 소켓에서 listen()을 호출하면 INADDR_ANY에 바인딩하면 소켓이 시스템의 사용 가능한 모든 로컬 IP에 바인딩됩니다. 이를 통해 클라이언트는 서버의 IP 중 하나에 연결할 수 있습니다. 서버가 inet_addr()을 대신 사용하면 서버가 클라이언트 연결을 허용 할 수있는 유일한 IP가됩니다.

클라이언트 소켓에서 connect()을 호출 할 때 서버가 수신 대기하는 특정 IP를 나타내야합니다. 클라이언트가 연결의 끝점에 대해 바인딩 할 로컬 IP를 선택하려는 경우 connect()을 호출하기 전에 bind()을 호출 할 수 있습니다. 클라이언트가 특정 IP에 바인드하지 않거나 INADDR_ANY에 바인드하면 소켓은 연결되어있는 서버 IP에 대한 사용 가능한 경로가있는 첫 번째 IP를 사용합니다.

연결이 설정되면 언제든지 각 소켓 끝점에서 getsockname()getpeername()을 호출하여 실제로 어떤 IP (및 포트)가 해당 연결에 사용되고 있는지 확인할 수 있습니다.