C sendto возвращает -1, если вещает на VPN - PullRequest
0 голосов
/ 24 июня 2010

Я создал сервер udp, который время от времени передает сообщение.Вещает без проблем.Но если я включу свой vpn, sendto начнет возвращать -1, даже если я отправляю INADDR_BROADCAST.

Я запускаю это на Mac, кстати, если это что-то изменит.Я действительно понятия не имею, почему это произойдет, мне действительно интересно, как может произойти сбой передачи udp?

Ответы [ 2 ]

0 голосов
/ 25 июня 2010

мой errno 227 (я думаю), который читает

sendto: не удается назначить запрошенный адрес

Я думаю, что он не может найти широковещательный порт при включении моего vpn, вот пример, когда я включаю свой vpn и выключаю его

2010-06-25 04: 05: 55.022 SwypeSendForMac2 [63687: 6203] записал 187 байт в socked 6 2010-06-25 04: 05: 56.023 SwypeSendForMac2 [63687: 6203] записал 187 байт в socked 6 2010-06-25 04: 05: 57.024 SwypeSendForMac2 [63687: 6203] записал 187 байт в socked 6 sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес sendto: не удается назначить запрошенный адрес 2010-06-25 04: 06: 05.027 SwypeSendForMac2 [63687: 6203] записал 187 байт в socked 6 2010-06-25 04: 06: 06.031 SwypeSendForMac2 [63687: 6203] записал 187 байт в socked 6

середина конечно с vpn на

вот мой маршрутный стол без vpn:

34: ~ samuelw $ netstat -r Таблицы маршрутизации

Интернет: Флаги шлюза назначения Ссылки Использовать Netif Expire по умолчанию 192.168.1.1 UGSc 63 0 en1 127 localhost UCS 0 0 lo0 localhost localhost UH 1 180317 lo0 169.254 ссылка № 5 UCS 1 0 en1 cronos.local ссылка # 5 UHLW 0 1 en1 192.168.1 ссылка № 5 UCS 4 0 en1 192.168.1.1 90: 84: d: d3: e2: 54 UHLWI 69 1260 en1 1123 192.168.1.98 0: 11: 24: a2: 41: 6d UHLWI 0 324 en1 1112 192.168.1.152 0: 21: e9: 76: fe: 6b UHLWI 0 0 en1 657 192.168.1.153 localhost UHS 0 118 lo0 192.168.1.154 0: 21: 5c: 52: e0: 11 UHLWI 1 2662 en1 1134

Internet6: Флаги шлюза назначения Netif Expire localhost localhost UH lo0 fe80 ::% lo0 localhost Uc lo0 локальная ссылка № 1 UHL lo0 fe80 ::% en1 ссылка № 5 UC en1 samuelmacbook.loca 0: 1e: c2: a6: 64: 98 UHL lo0 cronos.local 0: 21: 5c: 52: e0: 11 UHLW en1 ff01 :: localhost Um lo0 ff02 :: localhost UmC lo0 ff02 :: ссылка # 5 UmC en1

и с моим vpn

34: ~ samuelw $ netstat -r Таблицы маршрутизации

Интернет: Флаги шлюза назначения Ссылки Использовать Netif Expire по умолчанию 172.16.20.1 UGSc 8 0 ppp0 по умолчанию 192.168.1.1 UGScI 1 0 en1 127 localhost UCS 0 0 lo0 localhost localhost UH 1 180323 lo0 169.254 ссылка № 5 UCS 1 0 en1 cronos.local ссылка # 5 UHLW 0 1 en1 172.16.20.1 34.108.131.216.cli UH 9 0 ppp0 192.168.1 ссылка № 5 UCS 5 0 en1 192.168.1.1 90: 84: d: d3: e2: 54 UHLWI 3 1346 en1 1104 192.168.1.98 0: 11: 24: a2: 41: 6d UHLWI 2 378 en1 1093 192.168.1.152 0: 21: e9: 76: fe: 6b UHLWI 0 0 en1 637 192.168.1.153 localhost UHS 0 118 lo0 192.168.1.154 0: 21: 5c: 52: e0: 11 UHLWI 1 2665 en1 1114 192.168.1.255 ff: ff: ff: ff: ff: ff UHLWbI 0 2 en1 strong-sf1.reliabl 192.168.1.1 UGHS 25 25 en1216.131.108 ppp0 USc 0 0 ppp0

Internet6: Флаги шлюза назначения Netif Expire localhost localhost UH lo0 fe80 ::% lo0 localhost Uc lo0 локальная ссылка № 1 UHL lo0 fe80 ::% en1 ссылка № 5 UC en1 samuelmacbook.loca 0: 1e: c2: a6: 64: 98 UHL lo0 cronos.local 0: 21: 5c: 52: e0: 11 UHLW en1 ff01 :: localhost Um lo0 ff02 :: localhost UmC lo0 ff02 :: ссылка # 5 UmC en1

и вот мой код разделен на 2 функции

  • (интермедиат) StartService { широковещательная рассылка = 1;

    if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) { PError ( "розетка"); выход (1); }

    // этот вызов позволяет передавать широковещательные пакеты: if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, & broadcast, размер трансляции) == -1) { perror ("setsockopt (SO_BROADCAST)"); выход (1); }

    its_addr.sin_family = AF_INET; // порядок байтов хоста

    its_addr.sin_port = htons (SERVERPORT); // короткий, сетевой порядок байтов

    its_addr.sin_addr.s_addr = htonl (INADDR_BROADCAST);

    memset (its_addr.sin_zero, '\ 0', sizeof__ddr.sin_zero);

    возврат 0; }

  • (аннулируются) publishServiceLoop { NSAutoreleasePool * autoreleasePool = [[NSAutoreleasePool alloc] init]; NSString * message;

    while (живой) { while ((message = [AdyNetServer encodeToXML: сервер]) == ноль) { [NSThread sleepForTimeInterval: 3.0]; } const char * msgString = [сообщение cStringUsingEncoding: NSUTF8StringEncoding]; if ((numbytes = sendto (sockfd, msgString, [длина сообщения], 0, (struct sockaddr *) & их_аддр, размер их_аддр)) == -1) { PError ( "SendTo"); if ([[AdyErrorAlerter sharedInstance] делегат]) { [[[AdyErrorAlerter sharedInstance] делегат] receiveErrorMessage: [NSString stringWithFormat: @ "невозможно передать на сокет% d с сообщением% @", sockfd, msgString]]; }

        }
    else {
        NSLog(@"wrote %d bytes to socked %d",numbytes,sockfd);
    }
    
    //printf("sent %d bytes to %s\n", numbytes,
    //     inet_ntoa(their_addr.sin_addr));
    [NSThread sleepForTimeInterval:1.0];
    [autoreleasePool release];
    autoreleasePool = [[NSAutoreleasePool alloc] init];
    

    } [autoreleasePool release]; if (thread! = nil) { нить = ноль; [выпуск выпуска]; } }

0 голосов
/ 24 июня 2010

Вам следует проверить глобальную переменную errno для более подробного описания ошибки. Возможные значения для этого вызова описаны в разделе ОШИБКИ sendto (2) справочная страница.

Например:

[EACCES] Параметр SO_BROADCAST не установлен на сокете, а широковещательный адрес указан в качестве пункта назначения.

[EHOSTUNREACH] Адрес назначения указывает недоступный хост.

[ENETUNREACH] Нет маршрута к сети.

...