2012-04-29 12 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はい、バインド機能は、まれに、1つ以上のインターフェイスが宛先に到達できる場合に、サーバーに接続するときにも機能します。使用法はまったく同じです。connect()を呼び出す前にsocket()を作成してアドレスにbind()してください。 –

+0

トリックをやってくれてありがとう.-) – JavaCake

2

TCP接続には2つの同一のエンドがあり、確立されていれば互いに区別できません。 両端にIPアドレスとポート番号があり、他のコンピュータからデータを送信する必要があります。

connect機能は、クライアントに伝え、サーバが

でリッスンしているIPアドレスとポートがbind機能は、サーバからの応答をリッスンする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); 
} 
関連する問題