1

現在、ソケット プログラミングを行っていますが、複数のイーサネット デバイスを備えたコンピューターでコードをテストするときに、デバイスに接続する際に問題が発生します。

使用するイーサネットデバイスを定義するにはどうすればよいですか (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);
}

前もって感謝します。

4

2 に答える 2

3

バインド機能でリッスンアドレスを指定できます。

0.0.0.0 のアドレスは、コンピューターに属するすべてのインターフェイスと IP アドレスをリッスンするために使用されます。代わりに、特定の IP アドレスを指定してリッスンすることもできます。これにより、アドレスが属するインターフェイスのみが選択されます。

EDIT:ページの下部にあるMSDNの例は、従うのが簡単です

于 2012-04-29T11:44:28.063 に答える
2

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

このconnect関数は、サーバーがリッスンしているIPアドレスとポートをクライアントに通知します

このbind関数は、サーバーからの応答をリッスンする必要があるIPアドレスとポートをクライアントに通知します。電話をかけない場合bind()、オペレーティングシステムは自動的に適切な値を選択します。

(あなたが言ったことから)あなたが抱えている問題は、オペレーティングシステムが間違ったデフォルトのIPアドレスを選択しているということです。これがbind関数の出番です。

以下は、のアドレスにバインドするコードの(テストされていない)修正されたコピーです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);
}
于 2012-04-29T13:32:55.670 に答える