На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Как указать шлюз ipv4, через который отправлять данные? , Не меняя таблицы маршрутов Windows.
      Как указать шлюз ipv4, через который отправлять данные?

      Задача:
      Дано:
      На одном компьютере есть несколько интернет ipv4 подключений (от 2 до бесконечности).
      Найти:
      Способ указать, через какое ipv4 подключение, отправлять данные адресату.
      Решение:
      Прошу оформить решение.
        Kozlov_Sergey
        Функция bind: https://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx
        Ну и на системном уровне: таблица маршрутизации
          Цитата Pacific @
          Функция bind: https://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx
          Ну и на системном уровне: таблица маршрутизации

          А если все шлюзы ipv4 находятся в одной подсети?
            Вот пример для отправки сообщения с выбором адреса, с которого отправить:

            ExpandedWrap disabled
              #ifndef UNICODE
              #define UNICODE
              #endif
               
              #define WIN32_LEAN_AND_MEAN
               
              #include <winsock2.h>
              #include <Ws2tcpip.h>
              #include <stdio.h>
               
              // Link with ws2_32.lib
              #pragma comment(lib, "Ws2_32.lib")
               
              int main()
              {
               
                  // Declare some variables
                  WSADATA wsaData;
               
                  int iResult = 0;            // used to return function results
               
                  // the listening socket to be created
                  SOCKET SendSocket = INVALID_SOCKET;
               
                  // The socket address to be passed to bind
                  sockaddr_in service;
               
                  //----------------------
                  // Initialize Winsock
                  iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
                  if (iResult != NO_ERROR) {
                      wprintf(L"Error at WSAStartup()\n");
                      return 1;
                  }
                  //----------------------
                  // Create a SOCKET for listening for
                  // incoming connection requests
                  SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
                  if (SendSocket == INVALID_SOCKET) {
                      wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
                      WSACleanup();
                      return 1;
                  }
                  //----------------------
                  // The sockaddr_in structure specifies the address family,
                  // IP address, and port for the socket that is being bound.
                  service.sin_family = AF_INET;
                  service.sin_addr.s_addr = inet_addr("127.0.0.1");
                  service.sin_port = htons(27015);
               
                  //----------------------
                  // Bind the socket.
                  iResult = bind(SendSocket, (SOCKADDR *) &service, sizeof (service));
                  if (iResult == SOCKET_ERROR) {
                      wprintf(L"bind failed with error %u\n", WSAGetLastError());
                      closesocket(SendSocket);
                      WSACleanup();
                      return 1;
                  }
                  else
                      wprintf(L"bind returned success\n");
               
               
                  char pch[] = "test message";
               
                  sockaddr_in socket_address;
               
                  socket_address.sin_family = AF_INET;
                  socket_address.sin_addr.s_addr = inet_addr("127.0.0.1");
                  socket_address.sin_port = htons(10000);
               
                  FD_SET fd = {1, SendSocket};
                  TIMEVAL tv = {1000, 0};
                  if(select(0, NULL, &fd, NULL, &tv) == 0) {
                      wprintf(L"Send time out %u\n", WSAGetLastError());
                      closesocket(SendSocket);
                      WSACleanup();
                      return 1;
                  }
               
                  int nBytesSent = sendto(SendSocket, pch, strlen(pch), 0, (LPSOCKADDR)&socket_address, sizeof(SOCKADDR));
                  if(nBytesSent == SOCKET_ERROR) {
                      wprintf(L"sendto error %u\n", WSAGetLastError());
                      closesocket(SendSocket);
                      WSACleanup();
                      return 1;
                  }
                  wprintf(L"Bytes send %d\n",nBytesSent);
               
                  closesocket(SendSocket);
               
                  WSACleanup();
                  return 0;
              }


            Добавлено
            Вопрос про шлюзы в одной подсети остаётся открытым.
              Цитата Kozlov_Sergey @
              Вопрос про шлюзы в одной подсети остаётся открытым.

              Настраивать таблицу маршрутизации.
                Цитата Pacific @
                Настраивать таблицу маршрутизации.

                Настраивать таблицу маршрутизации на время отправки данных?
                Так какая-нибудь программа может в это же время в ту же сеть слать данные через ipv4 UDP и получит ошибку на той стороне, что не с того адреса пришло сообщение.

                Для ipv6 такие проблемы отсутствуют.

                Вот если бы можно было настроить таблицу маршрутов для конкретной программы, или для адреса назначения указать адрес шлюза для конкретной программы.
                Сообщение отредактировано: Kozlov_Sergey -
                  Kozlov_Sergey
                  Кто ж виноват, что архитектура твоей системы такая кривая. Чем изобретать костыли, лучше подумать, зачем вообще такая хитрая динамическая маршрутизация. Все как-то живут без нее.

                  P.S. Тут помогут только RAW сокеты, там в Ethernet хидере можно прописать, куда слать пакет.
                    Когда-то жили и без компьютера.
                    Когда-то жили в пещерах.
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0296 ]   [ 15 queries used ]   [ Generated: 17.07.25, 23:53 GMT ]