С открытым сокетом на конкретный IP - PullRequest
2 голосов
/ 26 октября 2011

Доступ к моему веб-сайту можно получить с любого из двух разных статических IP-адресов (IPv4).

Можно ли открыть TCP-соединение с другим сервером, указав, какой из 2 IP-адресов использовать в качестве адреса возврата?

x.x.x.x (мой сервер) => z.z.z.z (целевой сервер)
y.y.y.y (мой сервер) => z.z.z.z (целевой сервер)

Проверка ошибок и т. Д. В этом примере для простоты опущена:

struct addrinfo hints, *result;
hints.ai_flags = 0;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_addrlen = 0;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;

getaddrinfo(domain, "80", &hints, &result);

socket(result->ai_family, result->ai_socktype, result->ai_protocol);

Ответы [ 2 ]

6 голосов
/ 26 октября 2011

Как говорит @hochl, вы используете системный вызов bind:

struct sockaddr_in sin = { 0 };
int sock;

/* Create a socket address, with a specific port and (local) ipnumber */
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
inet_aton("1.2.3.4", &sin.sin_addr);

/* Create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Bind socket to the local address */
bind(sock, (struct sockaddr *) &sin, sizeof(sin));

/* Now connect to remote server... */
/* connect(...) */

Следует отметить, что использование inet_aton обычно не рекомендуется в пользу inet_pton.

1 голос
/ 26 октября 2011

Не уверен, но разве вы не можете bind подключить свой сокет к одному из своих локальных адресов перед тем, как подключиться? В этом случае вы можете выбрать, какой из ваших IP-адресов используется для подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...