2009-09-28 2 views
3

Возможно ли использовать сокеты на Win32 и , а не, возможно ли использовать брандмауэр для порта, который вы используете?Разъемы Win32 и Named Pipes

В Unix, вы можете использовать IF_UNIX вместо IF_INET (т.е. именованные каналы вместо розетки). Сейчас в Windows, вы можете open a socket using different protocols:

socket(AF_INET, SOCK_RAW, IPPROTO_TCP);  //open an IPv4 socket 
socket(AF_BTH,  SOCK_RAW, BTHPROTO_RFCOMM); //open a Bluetooth socket 
socket(AF_NETBIOS, SOCK_RAW, IPPROTO_TCP);  //open an IPX/SPX socket 
socket(AF_INET6, SOCK_RAW, IPPROTO_TCP);  //open an IPv6 socket 

Есть ли способ, чтобы открыть именованный сокет трубы? Например. (Гипотетический конструкт)

socket(AF_NAMEDPIPE, SOCK_RAW, IPPROTO_TCP); //open a named pipe socket 
+2

Не вдаваясь в святую войну, что заставляет вас заключить, что названные трубы на win32 - , так что ненадежно? Я использую WCF NetNamedPipeBinding в Windows без каких-либо проблем. –

+0

@ Matt, вы забираете статистику по глобальному распределению клиентов? Я видел частоту отказа около 1% неудачи, но только из статистики, не воспроизводимой в> 10 тестовых машинах ... пытаясь сформировать идею, если это плохое качество кода в системе, или эти вещи действительно ненадежны (я просто поехал уменьшение более чем в 10 раз частоты ошибок в конкретном действии за счет ненужного использования труб). – eglasius

+0

@eglasius, no. Я не использую трубы для связи по сети. Мое использование NetNamedPipeBinding изолировано от локального поля, и это работает надежно. Я все еще использую традиционные сокеты для пересечения границ машины. –

ответ

3

Я не пробовал это, но я полагаю, что если вы свяжете на адрес замыкания на себя, то вы должны быть ясно брандмауэра. Вероятно, вы захотите сделать это в любом случае, если ищете альтернативу именованным каналам, поскольку это должно быть быстрее, чем передача данных через сетевой адаптер.

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

5

Как сказал Джон Каван (который, как я думаю, когда-то учился в школе), использование loopback-адреса должно полностью избегать сетевой платы и брандмауэра, а также дает возможность перейти на полную модель клиент-сервер (т.е. машины, возможно, на разных платформах) позже с минимальными изменениями кода.

Я также успешно использовал разделяемую память для однопоточных коммуникаций. Это, как правило, быстрее, чем TCP/IP и именованные каналы. Тем не менее, я нашел именованные каналы на Win32 надежными и относительно быстрыми.

+0

Меня интересует комментарий надежности названных труб, можете ли вы поделиться больше?/см. комментарий, который я только что разместил в вопросе. – eglasius

+0

Другим достоинством TCP/IP и именных каналов является синхронизация доступа к общей памяти и указание готовности данных. –

-1

Существует адрес, что-то вроде девяносто двух шестидесяти восьми точечных var dot var, которые я создал с помощью Java, используя случайно выбранный порт в частном диапазоне использования и выиграть, пусть это будет работать без жалобы.

Смежные вопросы