Возможно вопрос дурной но все же:
Посылаю датограмму UDP на определенный порт (ххх=скажем 3000). С той стороны сервер автоответа. Как можно указать диапазон портов который выберет система для обратного ответа?
Запрос такой: [???] ==> [xxx=скажем 3000]
Ответ придет на порт [???], мне нужно указать, например, для ответа порт 63000.
Все написал на С# работает но порт выбирает скажем 1300.
Подскажите куда ноздри засунуть...
Re: UDP+C# : как указать порт для обратного ответа?
Здравствуйте, MarkovAlex, Вы писали:
MA>Возможно вопрос дурной но все же: MA>Посылаю датограмму UDP на определенный порт (ххх=скажем 3000). С той стороны сервер автоответа. Как можно указать диапазон портов который выберет система для обратного ответа? MA>Запрос такой: [???] ==> [xxx=скажем 3000] MA>Ответ придет на порт [???], мне нужно указать, например, для ответа порт 63000. MA>Все написал на С# работает но порт выбирает скажем 1300. MA>Подскажите куда ноздри засунуть...
Зависит от того, что подразумевается под "сервер автоответа", echo-сервер?
Echo-сервер отвечает на тот порт, с которого приходит датаграмма. Т.о. вам нужно перед отправкой связать сокет с определённым портом, на который будет возвращаться датаграмма. Как это сделать в C# —
Для сокетов — функция bind.
Нет ничего невозможного..
Re[2]: UDP+C# : как указать порт для обратного ответа?
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, MarkovAlex, Вы писали:
B>Зависит от того, что подразумевается под "сервер автоответа", echo-сервер? B>Echo-сервер отвечает на тот порт, с которого приходит датаграмма. Т.о. вам нужно перед отправкой связать сокет с определённым портом, на который будет возвращаться датаграмма. Как это сделать в C# — B>Для сокетов — функция bind.
1) В заголовке тедеграммы указывается 2 порта [с которого][куда]
2) Эхо программа слушает на порту /куда/ и отвечает на /с которого/
таким образом, имеем всеже 2 порта при каждом сокдинении, но в сокете указывается только 1!
второй автоматически назначается системой из свободного пространства адресов.
ВОПРОС: как задать диапозон для выбора этого порта по своему желанию, нужен 64000-64500.
Re[3]: UDP+C# : как указать порт для обратного ответа?
Здравствуйте, 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); /* Принимает ответ на порту, с которого отправляли */
Здравствуйте, butcher, Вы писали:
/скип/
ОГРОМНОЕ спосибо — теперь все почти кристально ясно! Сокеты рулят!
Я копал раньше UdpClient в ШАРПЕ там проще но лок порт выбрать нельзя.
Просчел в доке по Шарпу — действительно есть у сокетов свойство LocalEndPoint где можно установить ЛОКАЛЬНЫЙ порт.
Вопрос №2 как узнать локальгный свободный порт, скажем хочу 61000, а вдруг он занят?
Тогда просто не пройдет БИНД? Можно ли спросить свободный порт у системы?
Здравствуйте, MarkovAlex, Вы писали:
MA>Вопрос №2 как узнать локальгный свободный порт, скажем хочу 61000, а вдруг он занят? MA>Тогда просто не пройдет БИНД? Можно ли спросить свободный порт у системы?
Если указывать в качестве порта ноль, то тогда система выдаст свободный порт из определённого диапазона, обычно 1024..5000. Если порт занят bind должен выдать ошибку.