2015-10-08 4 views
1

Примечание: вопрос был отредактирован.Socket Programming- Change Socket IP

У меня есть несколько вопросов по Berkeley Socket программирования:

  1. Можно ли изменить адрес сокета после привязки? Если это так: для чего нужны команды C?

    2.According https://www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html, когда сокет привязан к INADDR_ANY, он принимает пакеты со всех интерфейсов, но когда пакет отправляется (используя отправленную команду), он отправляет через один сетевой адаптер с IP-адресом по умолчанию.

    Если я правильно понимаю: если на сервере есть два активных сетевых адаптера с разными IP-адресами, то сокет с параметром INADDR_ANY может принимать пакет с dst IP = x и отправлять пакет с src IP = y, где x равно нет, спасибо. Это может вызвать проблемы, например, в TCP-соединениях, где сокет в другом получателе будет получать пакет, но он его потеряет, поскольку IP-адрес не является ожидаемым.

    Это правда? И если это так, значит, серверные программы НЕ используют INADDR_ANY, где есть (два или более) активных сетевых адаптера с разными IP-адресами?

  2. Предположим, что сетевой адаптер IP по умолчанию является узким местом. Можем ли мы изменить параметры сокета, чтобы пакеты отправлялись через другие сетевые карты (а не предыдущий сетевой адаптер)? Можем ли мы это сделать, если сетевые карты имеют IP-адрес по умолчанию?

  3. Можем ли мы отправлять пакеты через один сетевой адаптер и назначать IP-адрес другому сетевому адаптеру? (То есть, NIC1 будет отправлять пакеты, и NIC2 будут получать только пакеты)

+1

TCP или UDP или другой? –

+1

INADDR_ANY предназначен для прослушивания на всех интерфейсах. Несколько сетевых адаптеров в разных подсетях будут посылать только через сетевой адаптер, где целевой доступ доступен. Несколько сетевых адаптеров в одной и той же подсети могут отправляться на NIC.На ваш вопрос номер 3 лучшим решением является использование связанного (или объединенного) интерфейса с 802.3ad. На ваш вопрос 4 ответ НЕТ. Если пакет поступит в NIC1, вы проигнорируете его? Направить его? Это просто не имеет смысла. Опять же, вы можете искать интерфейс. – alvits

+0

Очень сложно идти в ногу со всеми этими изменениями. Пожалуйста, попробуйте все сразу. Например, я думаю, что у вас все еще есть путаница между источником и пунктом назначения в нескольких местах. – EJP

ответ

3

Можно ли изменить адрес сокета после создания?

Сокеты не имеют IP-адреса для изменения при его создании. Они получают один, когда связаны.

Если так: что это за команды C?

В Berkeley Sockets API функции сделать это являются bind() и connect().

Когда сокет связывается с INADDR_ANY, он принимает пакеты со всех интерфейсов, но отправляет через один сетевой адаптер с IP-адресом по умолчанию.

Нет. Он отправляет пакеты через любой сетевой адаптер, необходимый для достижения цели в каждом случае.

Your cited source проводит различие без разницы. Сокет, связанный с INADDR_ANY, принимает пакеты из любого интерфейса. Нет никакой разницы между «любым» и «всем», что касается INADDR_ANY. Это гораздо легче понять как «любое».

Если я понимаю correctly- если сервер имеет две активные сетевые карты, с различными IP-адресами, то сокет с параметром INADDR_ANY может получить пакет с IP-ДСТ = х и послать пакет с Src IP = у, где x is not y

Нет. Он отправляет пакет с тем же исходным адресом, к которому первоначально был подключен клиент. Это часть того, что определяет соединение.

Это может вызвать проблемы, например, в TCP-соединениях, где сокет в другом получателе получит пакет, но его отбросит из-за того, что IP-адрес не является ожидаемым.

№ адресата в пакете является IP-адресом клиента. В противном случае он даже не попал бы туда. Это просто вздор. Если вы имеете в виду IP-адрес источника, см. Выше.

Это правда?

No.

И если SO- делает это означает, что программы сервера не используя INADDR_ANY, где есть (два или более) активных сетевых адаптеров с разными IP-адресами?

№ INADDR_ANY означает, что именно оно говорит. Любой IP-адрес: любой сетевой адаптер.

Предположим, что сетевой адаптер IP по умолчанию является узким местом. Можем ли мы изменить параметры сокета, чтобы пакеты отправлялись через другие сетевые карты (а не предыдущий сетевой адаптер)?

Нет, но вы можете изменить таблицы маршрутизации IP.

Можем ли мы это сделать, если сетевые карты имеют IP-адрес по умолчанию?

Только один из них может иметь IP-адрес по умолчанию. Вопрос не имеет смысла.

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

Только если вы отправляете на себя. В противном случае вопрос не имеет смысла.

(из вашей цитаты) При отправке, сокет, связанный с INADDR_ANY связывается с IP-адресом по умолчанию, который является то, что с наименьшим номером интерфейса

Я надеюсь, что это относится к тому, что имитатор быть описано. Если он предназначен для описания того, как работает TCP, это неправильно.

+0

Спасибо :) Я забыл, что на сервере есть таблица маршрутизации. – user3563894

+0

Вы также считаете, что исходный сетевой адаптер определяет адрес источника. Это не так. – EJP