2012-04-29 5 views
1

현재 소켓 프로그래밍을 사용하고 있지만 여러 이더넷 장치가있는 컴퓨터에서 코드를 테스트 할 때 장치 연결에 문제가 있습니다.TCPClient 연결을위한 특정 이더넷 장치 선택

어떤 이더넷 장치를 사용해야하는지 (Mac OS X) 어떻게 정의 할 수 있습니까?

출처 : 사전에

int sock, bytes_recieved; 
char send_data[1024],recv_data[1024]; 
struct hostent *host; 
struct sockaddr_in server_addr; 

host = gethostbyname("192.168.100.4"); 

cout << "Start" << endl; 

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    // perror("Socket"); 
    cout << "Socket error" << endl; 
    exit(1); 
} 

server_addr.sin_family = AF_INET;  
server_addr.sin_port = htons(30002); 
server_addr.sin_addr = *((struct in_addr *)host->h_addr); 
bzero(&(server_addr.sin_zero),8); 

if (connect(sock, (struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
{ 
    // perror("Connect"); 
    cout << "Connect error" << endl; 
    exit(1); 
} 

감사합니다.

답변

3

bind 기능으로 수신 대기 주소를 지정할 수 있습니다.

0.0.0.0의 주소가 컴퓨터에 속하는 모든 인터페이스와 IP 주소에서 수신하는 데 사용됩니다, 또는 당신 주소가

에 속하는 경우에만 인터페이스를 선택되는, 수신 할 특정 IP 주소를 지정할 수 있습니다

편집 : MSDN 페이지 하단의 예제는 더 쉽게 따라갈 수 있습니다.

+0

또한 TCPClient로서? – JavaCake

+1

@JavaCake 예, 드물게 목적지에 도달 할 수있는 인터페이스가 둘 이상인 경우에도 서버에 연결할 때 바인드 기능이 작동합니다. 사용법은 똑같습니다. connect()를 호출하기 전에 socket()을 만든 다음 bind()를 호출하십시오. –

+0

트릭을 수행해 주신 고마워요 .- – JavaCake

2

TCP 연결에는 2 개의 동일한 끝이 있으며, 일단 확립되면 서로 구별 할 수 없습니다. 양쪽 끝은 다른 컴퓨터가 데이터를 보내야하는 IP 주소와 포트 번호를 가지고 있습니다.

connect 기능은 클라이언트에게 서버가

bind 기능을 인식하는 IP 주소와 포트를 알려줍니다 IP 주소와 포트가 서버의 응답을 대기해야하는 클라이언트를 알려줍니다. bind()으로 전화하지 않으면 운영 체제가 자동으로 적절한 값을 선택합니다.

문제는 운영 체제가 잘못된 기본 IP 주소를 선택하고 있다는 것입니다. 여기가 바인드 함수가 들어있는 곳입니다.

아래는 192.168.100.2의 주소에 바인드되는 (테스트되지 않은) 코드의 수정본입니다. 이 주소를 사용하려는 인터페이스에 속한 주소로 변경해야합니다.

터미널을 열고 ifconfig -a을 입력하면 모든 인터페이스와 각 인터페이스에 속한 IP 주소의 목록이 인쇄됩니다. 다음 코드의 값 192.168.100.2을 사용하려는 인터페이스에 속한 IP 주소로 바꿔야합니다.

int sock, bytes_recieved; 
char send_data[1024],recv_data[1024]; 
struct hostent *host; 
struct sockaddr_in server_addr, local_addr; //Added a new variable in here for our local address 

host = gethostbyname("192.168.100.4"); //This is the address of the server we are connecting to 

cout << "Start" << endl; 

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    // perror("Socket"); 
    cout << "Socket error" << endl; 
    exit(1); 
} 

//Now we want to bind an IP address 
//This is an IP address that belongs to your computer, that will be used as the reply IP address 
local_addr.sin_family = AF_INET; 
local_addr.sin_addr.s_addr = inet_addr("192.168.100.2"); //CHANGE THIS: this is an address on your computer 
local_addr.sin_port = htons(0); //Leave this as 0 and the operating system will choose a unused one for you 
if bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1) 
{ 
    // perror("Bind"); 
    cout << "Bind error" << endl; 
    exit(1); 
} 

//Set up the structure that tells us what server to connect to 
server_addr.sin_family = AF_INET;  
server_addr.sin_port = htons(30002); 
server_addr.sin_addr = *((struct in_addr *)host->h_addr); 
bzero(&(server_addr.sin_zero),8); 
//And connect to the server 
if (connect(sock, (struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
{ 
    // perror("Connect"); 
    cout << "Connect error" << endl; 
    exit(1); 
}