2013-10-26 3 views
0

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

Вот код, я использую для связывания подножий UDP

int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
sockaddr_in address; 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = INADDR_ANY; 
address.sin_port = htons((unsigned short) /* port */); 
bind(handle, (const sockaddr*) &address, sizeof(sockaddr_in)) 

и вот код я использую для отправки пакета

sockaddr_in address; 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = htonl(/*local network IP Address*/); 
address.sin_port = htons((unsigned short) /* port */); 

sendto(handle, (const char*)/* packet data */, size, 0, (sockaddr*)&address, sizeof(sockaddr_in)); 

И, наконец, вот код, я использую для приема пакетов

sockaddr_in from; 
socklen_t fromLength = sizeof(from); 

int received_bytes = recvfrom(handle, (char*)data, size, 0, (sockaddr*)&from, &fromLength); 
+0

Скорее всего, проблема заключается в межсетевом экране на стороне * сервера *. Работает ли UDP-трафик с использованием ['netcat'] (http://netcat.sourceforge.net/)? Если нет, сначала исправьте брандмауэры (на домашнем маршрутизаторе вам нужно настроить перенаправление портов на стороне сервера или даже использовать сложную схему [NAT traversal] (http://en.wikipedia.org/wiki/NAT_traversal) в ваше приложение). – phihag

ответ

1

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

Проблема возникает не из кода, а из сетевой инфраструктуры.

+0

Вам не нужно предоставлять IP-адрес ISP или что-то еще, чтобы найти локальную сеть с ресивером? –

+0

http://beej.us/guide/bgnet/output/html/multipage/faq.html Эта страница содержит небольшой раздел, если вы находитесь за брандмауэром, что помогло ответить на мой вопрос. –

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