UDP+C# : как указать порт для обратного ответа?
От: MarkovAlex  
Дата: 16.03.05 12:28
Оценка:
Возможно вопрос дурной но все же:
Посылаю датограмму UDP на определенный порт (ххх=скажем 3000). С той стороны сервер автоответа. Как можно указать диапазон портов который выберет система для обратного ответа?
Запрос такой: [???] ==> [xxx=скажем 3000]
Ответ придет на порт [???], мне нужно указать, например, для ответа порт 63000.
Все написал на С# работает но порт выбирает скажем 1300.
Подскажите куда ноздри засунуть...
Re: UDP+C# : как указать порт для обратного ответа?
От: butcher Россия http://bu7cher.blogspot.com
Дата: 16.03.05 12:35
Оценка:
Здравствуйте, MarkovAlex, Вы писали:

MA>Возможно вопрос дурной но все же:

MA>Посылаю датограмму UDP на определенный порт (ххх=скажем 3000). С той стороны сервер автоответа. Как можно указать диапазон портов который выберет система для обратного ответа?
MA>Запрос такой: [???] ==> [xxx=скажем 3000]
MA>Ответ придет на порт [???], мне нужно указать, например, для ответа порт 63000.
MA>Все написал на С# работает но порт выбирает скажем 1300.
MA>Подскажите куда ноздри засунуть...

Зависит от того, что подразумевается под "сервер автоответа", echo-сервер?
Echo-сервер отвечает на тот порт, с которого приходит датаграмма. Т.о. вам нужно перед отправкой связать сокет с определённым портом, на который будет возвращаться датаграмма. Как это сделать в C# —
Для сокетов — функция bind.

Нет ничего невозможного..
Re[2]: UDP+C# : как указать порт для обратного ответа?
От: MarkovAlex  
Дата: 17.03.05 03:31
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, MarkovAlex, Вы писали:


B>Зависит от того, что подразумевается под "сервер автоответа", echo-сервер?

B>Echo-сервер отвечает на тот порт, с которого приходит датаграмма. Т.о. вам нужно перед отправкой связать сокет с определённым портом, на который будет возвращаться датаграмма. Как это сделать в C# —
B>Для сокетов — функция bind.

1) В заголовке тедеграммы указывается 2 порта [с которого][куда]
2) Эхо программа слушает на порту /куда/ и отвечает на /с которого/

таким образом, имеем всеже 2 порта при каждом сокдинении, но в сокете указывается только 1!
второй автоматически назначается системой из свободного пространства адресов.

ВОПРОС: как задать диапозон для выбора этого порта по своему желанию, нужен 64000-64500.
Re[3]: UDP+C# : как указать порт для обратного ответа?
От: butcher Россия http://bu7cher.blogspot.com
Дата: 17.03.05 05:04
Оценка:
Здравствуйте, MarkovAlex, Вы писали:

MA>1) В заголовке тедеграммы указывается 2 порта [с которого][куда]

Я в курсе

MA>2) Эхо программа слушает на порту /куда/ и отвечает на /с которого/


MA>таким образом, имеем всеже 2 порта при каждом сокдинении, но в сокете указывается только 1!

MA>второй автоматически назначается системой из свободного пространства адресов.
При использовании протокола UDP, и конкретно в этом случае неуместно говорить о соединениях..

MA>ВОПРОС: как задать диапозон для выбора этого порта по своему желанию, нужен 64000-64500.

Ещё раз говорю. Перед тем как посылать датаграммы, ныжно связать сокет с адресом и портом, с котрого он будт отправлять датаграммы, и заодно, на нём же будет и принимать их.
Вот примерная схема:
 SOCKADDR_IN addr;
 const short PORT = 5678;
 /* создаётся датаграммный сокет */
 SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 
 /* связываем сокет с портом, с которого нужно отравлять датаграммы */
 addr.sin_addr.s_addr = htonl(INADDR_ANY);
 addr.sin_port = htons(PORT); /* <-- во с этим портом */
 addr.sin_family = AF_INET;
 
 bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); /* Связываем */
 
 addr.sin_addr.s_addr = inet_addr("xx.xx.xx.xx"); /* на адрес хх.хх.хх.хх будем отправлять */
 addr.sin_port = htons(3000); /* на порт 3000 */
 
 sendto(sock, buf, buf_size, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); /* Отправляем */
 
 recvfrom(sock, buf, buf_size, 0, (SOCKADDR*)&addr, &nSize); /* Принимает ответ на порту, с которого отправляли */

Нет ничего невозможного..
Re[4]: UDP+C# : Сокеты - это круто. Вопрос №2
От: MarkovAlex  
Дата: 17.03.05 05:56
Оценка:
Здравствуйте, butcher, Вы писали:
/скип/
ОГРОМНОЕ спосибо — теперь все почти кристально ясно! Сокеты рулят!
Я копал раньше UdpClient в ШАРПЕ там проще но лок порт выбрать нельзя.
Просчел в доке по Шарпу — действительно есть у сокетов свойство LocalEndPoint где можно установить ЛОКАЛЬНЫЙ порт.

Вопрос №2 как узнать локальгный свободный порт, скажем хочу 61000, а вдруг он занят?
Тогда просто не пройдет БИНД? Можно ли спросить свободный порт у системы?
Re[5]: UDP+C# : Сокеты - это круто. Вопрос №2
От: butcher Россия http://bu7cher.blogspot.com
Дата: 17.03.05 06:02
Оценка:
Здравствуйте, MarkovAlex, Вы писали:

MA>Вопрос №2 как узнать локальгный свободный порт, скажем хочу 61000, а вдруг он занят?

MA>Тогда просто не пройдет БИНД? Можно ли спросить свободный порт у системы?

Если указывать в качестве порта ноль, то тогда система выдаст свободный порт из определённого диапазона, обычно 1024..5000. Если порт занят bind должен выдать ошибку.

Нет ничего невозможного..
Re[6]: UDP+C# : Сокеты - это круто. Вопрос №2
От: MarkovAlex  
Дата: 17.03.05 06:15
Оценка:
Спосибо, butcher!.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.