12

C で単純なクライアントとサーバーを実装しようとしていますが、特定の IP アドレスをクライアントに設定する方法の例をオンラインで見つけることができません。これは私がこれまでに得たものです:

sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
    <some code to handle error>
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(<addressOfTheServer>);
address.sin_port = htons(<portToConnectToServer>);
len = sizeof(address);

int result = connect(sockfd, (struct sockaddr *)&address, len);

サーバー側でクライアントの IP アドレスを確認すると、常に 127.0.0.1 が返されます

違うものに変えたい。

4

2 に答える 2

32

クライアントが特定のネットワーク インターフェイスを使用して接続するようにしたい場合 (複数のネットワーク カードを使用している場合など)、最初bind(2)にそのインターフェイスの IP アドレスを呼び出す必要がありますconnect。たとえば、IP アドレスが 192.168.1.100 と 10.101.151.100 の 2 つのネットワーク インターフェイスがある場合、192.168.1.100 アドレスを使用して接続するには、次のようにします。

// Error checking omitted for expository purposes
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

// Bind to a specific network interface (and optionally a specific local port)
struct sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = inet_addr("192.168.1.100");
localaddr.sin_port = 0;  // Any local port will do
bind(sockfd, (struct sockaddr *)&localaddr, sizeof(localaddr));

// Connect to the remote server
struct sockaddr_in remoteaddr;
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr(server_ip);
remoteaddr.sin_port = htons(server_port);
connect(sockfd, (struct sockaddr *)&remoteaddr, sizeof(remoteaddr));
于 2013-03-28T05:23:39.840 に答える