
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как указать шлюз ipv4, через который отправлять данные?
Задача: Дано: На одном компьютере есть несколько интернет ipv4 подключений (от 2 до бесконечности). Найти: Способ указать, через какое ipv4 подключение, отправлять данные адресату. Решение: Прошу оформить решение. |
Сообщ.
#2
,
|
|
|
Kozlov_Sergey
Функция bind: https://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx Ну и на системном уровне: таблица маршрутизации |
Сообщ.
#3
,
|
|
|
Цитата Pacific @ Функция bind: https://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx Ну и на системном уровне: таблица маршрутизации А если все шлюзы ipv4 находятся в одной подсети? |
Сообщ.
#4
,
|
|
|
Вот пример для отправки сообщения с выбором адреса, с которого отправить:
![]() ![]() #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; } Добавлено Вопрос про шлюзы в одной подсети остаётся открытым. |
Сообщ.
#5
,
|
|
|
Цитата Kozlov_Sergey @ Вопрос про шлюзы в одной подсети остаётся открытым. Настраивать таблицу маршрутизации. |
Сообщ.
#6
,
|
|
|
Цитата Pacific @ Настраивать таблицу маршрутизации. Настраивать таблицу маршрутизации на время отправки данных? Так какая-нибудь программа может в это же время в ту же сеть слать данные через ipv4 UDP и получит ошибку на той стороне, что не с того адреса пришло сообщение. Для ipv6 такие проблемы отсутствуют. Вот если бы можно было настроить таблицу маршрутов для конкретной программы, или для адреса назначения указать адрес шлюза для конкретной программы. |
Сообщ.
#7
,
|
|
|
Kozlov_Sergey
Кто ж виноват, что архитектура твоей системы такая кривая. Чем изобретать костыли, лучше подумать, зачем вообще такая хитрая динамическая маршрутизация. Все как-то живут без нее. P.S. Тут помогут только RAW сокеты, там в Ethernet хидере можно прописать, куда слать пакет. |
Сообщ.
#8
,
|
|
|
Когда-то жили и без компьютера.
Когда-то жили в пещерах. |
Сообщ.
#9
,
Сообщение отклонено: Oleg2004 -
|