LINUX.ORG.RU

Connect & bind


0

0

sd = socket(PF_INET,SOCK_STREAM,0); memset ((char *)&rsin, '\0', sizeof(rsin)); memset ((char *)&lin, '\0', sizeof(lin));

lin.sin_family = AF_INET; lin.sin_addr.s_addr = inet_addr("127.0.0.1"); rsin.sin_port = htons(80); rsin.sin_family = AF_INET; rsin.sin_addr.s_addr = inet_addr("xxxx.xxx.xxx.xxx") ;

rv = bind(sd,(const sockaddr *)&lin,sizeof(lin)); rv = connect(sd,(const sockaddr *)&rsin,sizeof(rsin));

Вот если вместо xxx.xxx.xxx.xxx писать локальный адрес, то все ОК. Если внешний, то strerror(errno) = Can't assign requested address

С доступом во внешний мир все ок. В чем косяк?

anonymous

bindить можно только к локальному адресу у которого есть интерфейс на котором он висит. Биндиться к любому адресу не имеет смысла так как тебе ответные пакеты не будут приходить так как не понятно как их деливарить

lg ★★
()
Ответ на: комментарий от anonymous

>Так я и делаю bind к 127.0.0.1 а connect хочу к удаленному серверу, а
>он не разрешает

вы определитесь что пишите: клиент али сервер... клиенту bind не нужен.

signal11
()

Возможно проблема в другом, но все же после bind на сервере надо делать listen

seiken ★★★★★
()
Ответ на: комментарий от signal11

Странно, конечно. Я считал, что для клиента bind не то чтобы не нужен, а не обязателен. Если его не писать, то ОС прибиндит сама. Но я впихивал его всегда. Писал под linux. Сейчас пишу клиента под freebsd. И убрав bind все заработало. Большое спасибо за рекомендацию. Но может кто просвятит меня по поводу bind на клиенте, потому что здесь он используется:

http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=fsync&category=2

PS: Еще раз спасибо!

anonymous
()

Вы вызовом ф-ции bind сказали кернелю, что принимаете сообщения только от 127.0.0.1 с порта 80 - потому и connect потом на удалёный хост не идёт.

anonymous
()
Ответ на: комментарий от anonymous

ЗЫ про порт забудьте - это я в глубокой ночи немного мимо посмотрел :)

anonymous
()
Ответ на: комментарий от anonymous

если bind не использовать то OS сама определит в соответствии с рутингом на какой адрес нада забиндиться. В ситуации когда у тебя извратный рутинг(например ipfw fwd используешь, или динамический рутинг) то OS может не правильно выбрать адрес. Поэтому тебе замому придется биндиться .. но ОС может тебя перебиндить потом на другой адрес в зависимости от ситуации

поищи в поиске(когда он заработает) по этому поводу .. я когда то давно рассказывал как конкретно все эти механизмы работают

lg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.