Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UDP пакеты через роутер 
V
    Опции темы
kibr3
Дата 7.9.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



Не могу послать UDP пакеты через роутер помогите.
Есть 2 простые программы. Одна посылает UDP пакеты (Client) другая принимает (Server). Через порт 5904 или любой другой свободный.
Все это прекрасно работает в локальной сети.
Чтобы проверить как работает через интернет сделал следующее. 
В Map-e Роутерa прописал пересылать все пакеты (TCP и UDP) приходящие извне на порт 5904 на внутренний
адрес 192.168.0.4. Проверил это из браузера (TCP/IP) через внешний прокси сервер - все хорошо, связь есть.
Но вот посылаю UDP пакеты на свой внешний IP по порту 5904 и они теряются и не доходят вообще.
По идее должны же приходить? Или я что-то не понимаю.   
Программа Client консоли  для Visual C ниже.
Код

/* timecli.c */
/* Gets the current time from a UDP server */
/* Last modified: September 23, 2005 */
/* http://www.gomorgan89.com */
/* Link with library file wsock32.lib */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winsock.h>

#define SIZE 500

void usage(void);

int main(int argc, char **argv)
{
    WSADATA w;                                /* Used to open Windows connection */
    unsigned short port_number;                /* The port number to use */
    SOCKET sd;                                /* The socket descriptor */
    int server_length;                        /* Length of server struct */
    char send_buffer[SIZE] = "GET TIME\r\n";/* Data to send */
    time_t current_time;                    /* Time received */
    struct hostent *hp;                        /* Information about the server */
    struct sockaddr_in server;                /* Information about the server */
    struct sockaddr_in client;                /* Information about the client */
    int a1, a2, a3, a4;                        /* Server address components in xxx.xxx.xxx.xxx form */
    int b1, b2, b3, b4;                        /* Client address components in xxx.xxx.xxx.xxx form */
    char host_name[256];                    /* Host name of this computer */

    /* Make sure command line is correct */
    if (argc != 3 && argc != 4)
    {
        usage();
    }
    if (sscanf_s(argv[1], "%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4)
    {
        usage();
    }
    if (sscanf_s(argv[2], "%u", &port_number) != 1)
    {
        usage();
    }
    if (argc == 4)
    {
        if (sscanf_s(argv[3], "%d.%d.%d.%d", &b1, &b2, &b3, &b4) != 4)
        {
            usage();
        }
    }

    /* Open windows connection */
    if (WSAStartup(0x0101, &w) != 0)
    {
        fprintf(stderr, "Could not open Windows connection.\n");
        exit(0);
    }

    /* Open a datagram socket */
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd == INVALID_SOCKET)
    {
        fprintf(stderr, "Could not create socket.\n");
        WSACleanup();
        exit(0);
    }

    /* Clear out server struct */
    memset((void *)&server, '\0', sizeof(struct sockaddr_in));

    /* Set family and port */
    server.sin_family = AF_INET;
    server.sin_port = htons(port_number);

    /* Set server address */
    server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
    server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
    server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
    server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;

    /* Clear out client struct */
    memset((void *)&client, '\0', sizeof(struct sockaddr_in));

    /* Set family and port */
    client.sin_family = AF_INET;
    client.sin_port = htons(0);

    if (argc == 3)
    {
        /* Get host name of this computer */
        gethostname(host_name, sizeof(host_name));
        hp = gethostbyname(host_name);

        /* Check for NULL pointer */
        if (hp == NULL)
        {
            fprintf(stderr, "Could not get host name.\n");
            closesocket(sd);
            WSACleanup();
            exit(0);
        }

        /* Assign the address */
        client.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr_list[0][0];
        client.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr_list[0][1];
        client.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr_list[0][2];
        client.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr_list[0][3];
    }
    else
    {
        client.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)b1;
        client.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)b2;
        client.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)b3;
        client.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)b4;
    }

    /* Bind local address to socket */
    if (bind(sd, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1)
    {
        fprintf(stderr, "Cannot bind address to socket.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }

    /* Tranmsit data to get time */
    server_length = sizeof(struct sockaddr_in);
    if (sendto(sd, send_buffer, (int)strlen(send_buffer) + 1, 0, (struct sockaddr *)&server, server_length) == -1)
    {
        fprintf(stderr, "Error transmitting data.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }

    /* Receive time */
    if (recvfrom(sd, (char *)&current_time, (int)sizeof(current_time), 0, (struct sockaddr *)&server, &server_length) < 0)
    {
        fprintf(stderr, "Error receiving data.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }

    /* Display time */
    printf("Current time: %s", ctime(&current_time));


    closesocket(sd);
    WSACleanup();

    return 0;
}

void usage(void)
{
    fprintf(stderr, "Usage: timecli server_address port [client_address]\n");
    exit(0);
}

PM MAIL   Вверх
Олег2005
Дата 9.9.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Рутер получает пакет, анализирует его - и как видит порт 5904 - меняет адрес получателя на 192.168.0.4 - и далее должен отослать пакет по этому же самому порту (т.е. приложению, идентифицированному этим портом).  Вроде так.
Надо сниффером посмотреть - приходят ли на карточку вообще пакеты...
PM MAIL WWW MSN   Вверх
kibr3
Дата 10.9.2011, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



Цитата

Рутер получает пакет, анализирует его - и как видит порт 5904 - меняет адрес получателя на 192.168.0.4 - и далее должен отослать пакет по этому же самому порту (т.е. приложению, идентифицированному этим портом).  Вроде так.
Надо сниффером посмотреть - приходят ли на карточку вообще пакеты... 

Сниффером посмотрел. Если посылаю на внешний IP роутера то пакеты идут. Но далее тишина. Да еще заметил что когда посылал  на свой же IP 192.168.0.4 якобы для проверки то пакеты вообще не шли в сеть но запущенный UDP сервер принимал все. То есть дальше сетевой карты не уходило.  Выходит даже для первичной проверки надо отсылать из другого компа в локльной сети. Но так у меня тоже работает. 

Тут  шеф (менеджер)  оказывается бывший сетевик и провайдер говорит что нынешние модемы не могут пересылать никакие данные изнутри по внешнему IP даже если замаппировано. Вот раньше у него был модем-роутер от Cisco который это умел через какие-то настройки. Щас ищу варианты проверки своей UDP программульки и игр с ним.  Надо посылать и принимать откуда-то извне пакеты. Варианты:
1. Apach сервер с реальным IP ставить у себя как предлагает шеф не хочется. Долго возиться. 
2. Socks5 прокси. Но там тоже надо протокол связи с ним фигачить. Хорошо бы библиотеки иметь для него. 
3. Взять хостинг с поддержкой socket_sendto и подобных функций но это Shell access и за недорого пока не нахожу. 
Какие есть идеи на этот счет?
PM MAIL   Вверх
Леопольд
Дата 12.9.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: нет
Всего: 13



Цитата(kibr3 @  7.9.2011,  14:49 Найти цитируемый пост)
Чтобы проверить как работает через интернет сделал следующее. 
Если ходит в локалке, то и по интернету будет путешествовать...

Добавлено @ 13:20
Цитата(Олег2005 @  9.9.2011,  21:29 Найти цитируемый пост)
и далее должен отослать пакет по этому же самому порту (т.е. приложению, идентифицированному этим портом).
А что если N машин слушают один и тот же порт (ssh и т.п. порты яркий пример)? Между портами тоже есть маппинг. Поэтому NAT и критикуют, уменьшается макс. количество портов на одну машину прямо пропорционально размеру сетки 65535/N.


Это сообщение отредактировал(а) Леопольд - 12.9.2011, 13:22


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Олег2005
Дата 12.9.2011, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(Леопольд @  12.9.2011,  12:11 Найти цитируемый пост)
Поэтому NAT и критикуют, уменьшается макс. количество портов на одну машину прямо пропорционально размеру сетки 65535/N.

Согласен. Но ведь никто заранее не скажет мне, что на порту 55555 сидят 10 машин? Поэтому попробовать всегда надо....
Но вот когда не получается - надо искать иные способы. А это непросто.

Добавлено @ 17:42
Цитата(kibr3 @  10.9.2011,  04:52 Найти цитируемый пост)
1. Apach сервер с реальным IP ставить у себя как предлагает шеф не хочется. Долго возиться. 

Это все-таки оптимальнее всех иных методов. Да и не так сложно поднять Апач.

Это сообщение отредактировал(а) Олег2005 - 12.9.2011, 17:43
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.