2016-03-09 4 views
3

У меня есть сокет сервера C++, который работает на виртуальной машине. Я включил переадресацию порта для порта, где слушает серверный сокет. Однако из-за динамического связывания я не знаю, на каком порту будет выполняться связь. ОС у меня в виртуальной машине принимает динамическое связывание в следующем диапазоне:Динамическое связывание сокетов с уменьшенным диапазоном

cat /proc/sys/net/ipv4/ip_local_port_range 
32768 61000 

Есть ли способ (как параметр в затруднительное/принять), в котором я мог бы указать на мой сервер сокета, что он имеет чтобы уменьшить этот диапазон несколько портов, то есть: [35000 35010]

Приветствия

+3

Нет. Вы должны либо привязать ваш сокет к фиксированному порту, либо использовать службу именования или какой-либо другой механизм обнаружения, чтобы клиенты могли открыть служебный порт. Трудно понять, что ваше предложение покупает. – EJP

+0

вот что я боялся услышать! :) – Stefano

+2

Ваш вопрос не имеет никакого смысла. Переадресация портов основана на целевом порту, который является портом, который слушает сервер. Никакой «переадресации» не требуется на основе исходного порта. Вы действительно на самом деле включили переадресацию портов? Слушающие порты никогда не выполняют динамическое связывание. –

ответ

-2

сокет слушающий сервер должен быть привязан к конкретному порту, чтобы принимать клиентские подключения. На большинстве платформ вы можете установить bind() сокет в порт 0 и привязать его к произвольному доступному порту. Но он все еще привязан к определенному порту.

Вы не можете привязать сокет к нескольким портам. Если вам необходимо прослушивать несколько портов, вы должны создать отдельный гнездо для прослушивания для каждого порта и bind() отдельно (т.е. один разъем на порту 35000, один разъем на порту 35001, один разъем на порту 35002 и т. Д., До порта 35010).

Вы также не можете привязать сокет к доступному порту в пределах заданного диапазона. Вы можете привязываться только к определенному порту или к порту 0. Если вам нужно прослушивать доступный порт в заданном диапазоне, вы должны зацикливать свой вызов на bind(), начиная с самого низкого порта и последовательно пробирая каждый порт до тех пор, пока bind() является успешным или диапазон исчерпан.

+1

Я не думаю, что вы поняли вопрос. Он не хочет связываться с несколькими портами: он хочет привязываться к одному из ограниченного диапазона портов. Почему, я не знаю. – EJP

+0

Я ответил на вопрос: «* Есть ли способ (например, параметр bind/accept), в котором я мог бы указать свой сокет для сервера, который должен уменьшить этот диапазон до нескольких портов, т. Е. [35000 35010] *" - ответ - нет, сокет может привязываться только к определенному порту, а не к диапазону портов. Затем я предложил, как привязывать по диапазонам, если это необходимо. –

+2

@RemyLebeau Даже если бы существовал способ привязки к ряду портов, это не отвечало бы на вопрос. Это не уменьшит диапазон портов источника или не повлияет на них. –