備忘録

備忘録

C言語+Linuxで任意ネットワークインターフェイスを指定してTCP接続する方法

Ⅰ. はじめに

タイトルの通り「C言語+Linuxで任意ネットワークインターフェイスを指定してTCP接続する方法」です。

Ⅱ. 手順

1. サンプルプログラムを書く

main.c

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>

int main() {
  int sock = socket(PF_INET, SOCK_STREAM, 0);
  if (sock == -1) {
    printf("socket errno: %d\n", errno);
    close(sock);
    return -1;
  }

  char name[] = "eth0";
  // char name[] = "eth1";
  if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, name, sizeof(name)) == -1) {
    printf("setsockopt errno: %d\n", errno);
    close(sock);
    return -1;
  }

  struct sockaddr_in target = {0};
  target.sin_family = PF_INET;
  target.sin_addr.s_addr = inet_addr("1.0.0.0"); // Your server IP address
  target.sin_port = htons(8000); // Your server port

  if (connect(sock, (struct sockaddr *)&target, sizeof(target)) == -1) {
    printf("connect errno: %d\n", errno);
    close(sock);
    return -1;
  }
}

実行結果

接続元ホスト名が異なっている為、任意ネットワークインターフェイスでの接続に成功した事がわかる。

サーバー側

$ nc -k -v -l 8000
Connection received on ***.ipoe.ocn.ne.jp 34199
Connection received on ***.openmobile.ne.jp 3424

クライアント側

// eth0
gcc main.c && ./a.out

// eth1
gcc main.c && ./a.out