jenya7 0 17 сентября, 2017 Опубликовано 17 сентября, 2017 (изменено) · Жалоба Ну хорошо. Другой вопрос. Я в таске принимаю данные с сервера mlen = read (soc_desc, read_buff, sizeof(read_buff)); у нас для чтения есть еще три функции recvfrom( ) recv( ) recvmsg( ) какую лучше использовать? из описания я понял что recvfrom( ), recvmsg( ) - это для UDP, а recv( ) - для TCP. так ли это или я ошибаюсь? и потом я не понимаю как синхронизируется посылка-прием между клиентом и сервером. полингом я читаю данные которые давно уже отправлены. нет какого то флага или прерывания от сервера? Изменено 17 сентября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 31 октября, 2017 Опубликовано 31 октября, 2017 · Жалоба Создал сокет как TCP Client. Читаю с сервера, пишу на сервер, все нормально. Но если вытащили кабель или сервер захлопнулся - какие мои действия? Закрыть старый сокет и пытаться открыть новый все время в таске? Как то не логично. Если связь упала то получается я ломлюсь в закрытую дверь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 4 ноября, 2017 Опубликовано 4 ноября, 2017 · Жалоба И какой вывод можно получить? Что компьютер little endian, а в интернете как водится big endian. Есть такие функции для преобразования uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); https://linux.die.net/man/3/ntohl Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2017 Опубликовано 12 ноября, 2017 (изменено) · Жалоба Мой девайс присоединен к двум другим. С одним он должен разговаривать по TCP с IP адресом X, с другим по UDP с IP адресом Y. Физически там только один ETH канал. Возможно определить два сокета TCP и UDP с разными IP адресами? Я так понимаю нужно определить на уровне драйвера два IP адреса? Изменено 12 ноября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 12 ноября, 2017 Опубликовано 12 ноября, 2017 · Жалоба Мой девайс присоединен к двум другим. С одним он должен разговаривать по TCP с IP адресом X, с другим по UDP с IP адресом Y. Физически там только один ETH канал. . . . Попробуйте на PC arp -s . . . . arp -a Маршрутизатор должен "знать" что на этот один MAC привязаны несколько IP И естественно Ваш девайс должен уметь с ним (маршрутизатором или другим девайсом) "договориться" об этом автоматически. ps - из arp /? Пример: > arp -s 157.55.85.212 00-aa-00-62-c6-09 ... Добавляет статическую запись. > arp -a ... Выводит ARP-таблицу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2017 Опубликовано 12 ноября, 2017 (изменено) · Жалоба Попробуйте на PC arp -s . . . . arp -a Маршрутизатор должен "знать" что на этот один MAC привязаны несколько IP И естественно Ваш девайс должен уметь с ним (маршрутизатором или другим девайсом) "договориться" об этом автоматически. копаюсь в коде. вижу что определение IP уходит в драйвер лэйер. но в линуксе все драйвера сидят в кернеле. по крайней мере я вижу только объектные файлы. В камень заходят только TX+/TX-, RX+/RX-. Получается у него внутри и PHY и MAC. Получается все нужно конфигурировать внутри. Изменено 12 ноября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 12 ноября, 2017 Опубликовано 12 ноября, 2017 · Жалоба Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP). Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение. ps Для PC/Linux оно должно быть, а вот для embedded - тут вопрос. psps Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ? IMHO а тема - IP aliasing :) Насколько понял, настраивается методом прописки config-файлов Linux :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2017 Опубликовано 12 ноября, 2017 (изменено) · Жалоба Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP). Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение. ps Для PC/Linux оно должно быть, а вот для embedded - тут вопрос. psps Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ? IMHO а тема - IP aliasing :) Насколько понял, настраивается методом прописки config-файлов Linux :) есть конфигурационные хедеры но там ни слова об IP. По моему нашел ifAddrAdd( ) NAME ifAddrAdd( ) - add an interface address for a network interface SYNOPSIS STATUS ifAddrAdd ( char * interfaceName, /* name of interface to configure */ char * interfaceAddress, /* Internet address to assign to interface */ char * broadcastAddress, /* broadcast address to assign to interface */ int subnetMask /* subnetMask */ ) DESCRIPTION This routine assigns an Internet address to a specified network interface. The Internet address can be a host name or a standard Internet address format (e.g., 90.0.0.4). If a host name is specified, it should already have been added to the host table with hostAdd( ). You must specify both an interfaceName and an interfaceAddress. A broadcastAddress is optional. If broadcastAddress is NULL, in_ifinit( ) generates a broadcastAddress value based on the interfaceAddress value and the netmask. A subnetMask value is optional. If subnetMask is 0, in_ifinit( ) uses a subnetMask the same as the netmask that is generated by the interfaceAddress. The broadcastAddress is also destAddress in case of IFF_POINTOPOINT. тут возникает другой вопрос. допустим сконфигурировал //FIRST IP; ifAddrSet ("ETH0","10.0.0.10"); ifMaskSet ("ETH0", 0xffffff00); //SECOND IP ifAddrAdd ("ETH0","192.168.101.100","192.168.101.255",0xffffff00); а как задать что первый IP относиться к UDP , а второй IP к TCP? Изменено 12 ноября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 ноября, 2017 Опубликовано 13 ноября, 2017 · Жалоба а как задать что первый IP относиться к UDP , а второй IP к TCP?Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то TCP/IP стек сам выберет нужный IP на основании того, куда вы их подключите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 ноября, 2017 Опубликовано 14 ноября, 2017 (изменено) · Жалоба Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то TCP/IP стек сам выберет нужный IP на основании того, куда вы их подключите есть требование чтоб данные сокетов не прерсекались, то есть шли в разных потоках, если можно так выразиться. а если сделать байнд? struct sockaddr_in localaddr; localaddr.sin_family = AF_INET; localaddr.sin_addr.s_addr = inet_addr("192.168.1.100"); localaddr.sin_port = 0; bind(sockfd, (struct sockaddr *)&localaddr, sizeof(localaddr)); Изменено 14 ноября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба Да, мой тезис по alias ошибочен. Два адреса у одного Ethernet-интерфейса будут, но по приему все будет "сыпать" в одну кучу (на один порт TCP/UDP будут попадать пакеты и для одного алиасного IP и для другого) . В Вашем посте выше STATUS ifAddrAdd ( char * interfaceName, /* name of interface to configure */ <<<<<<<<<<<<<<<<<<< char * interfaceAddress, /* Internet address to assign to interface */ char * broadcastAddress, /* broadcast address to assign to interface */ int subnetMask /* subnetMask */ ) Если "раздвоить" физ. интерфейс (на ниженем уровне стека или вообще до него) то задача решается "автоматически". Как например, если было бы 2 физических Ethernet (интерфейса) и соотв-но 2 привязанных IP. В этом случае при организации сокета надо указать, а на какой из них (интерфейсов) он будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба Да, мой тезис по alias ошибочен. Два адреса у одного Ethernet-интерфейса будут, но по приему все будет "сыпать" в одну кучу (на один порт TCP/UDP будут попадать пакеты и для одного алиасного IP и для другого) . В Вашем посте выше Если "раздвоить" физ. интерфейс (на ниженем уровне стека или вообще до него) то задача решается "автоматически". Как например, если было бы 2 физических Ethernet (интерфейса) и соотв-но 2 привязанных IP. В этом случае при организации сокета надо указать, а на какой из них (интерфейсов) он будет работать. а мне тут сказали что если делать байнд - два сокета на два разных IP то этого достаточно чтоб разделить потоки на транспортном уровне. даже не знаю, я не большой спец в этих вопросах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба . . . я не большой спец в этих вопросах. Да я тоже не спец, скорее соискатель по теме. Был небольшой опыт по работе с UDP в распределенной интранет. -------- (0) Канальный уровень, насколько могу предположить, обеспечивается Ethernet фреймами == MAC. (1) сетевой + транспортный == IP == интерфейс (2) TCP, UDP, . . . . между (0) и (1) еще много чего в виде сетевых протоколов нижнего уровня, в том числе ARP, SNMP. (?) Может знающие подскажут. bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов, на который отсылается пакет ? (например, порт 80, один сокет для приема, и n сокетов для каждого подключения ? ) Как bind работает при приеме ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов, на который отсылается пакет ? Нет. bind дает вашему локальному сокету адрес. При приеме (когда сокет серверный) именно к этому адресу должны будут присоединяться клиенты (или посылать на него пакеты - например для UDP сокетов). Адрес однозначно определяет в какой сети находится ваш сервер. Система не даст присвоить IP сокету из другой сети. При передаче все проще - система сама даст адрес сокету, если вы его не присвоили явно через bind. IP будет взято из вашей сети (если сетей несколько, то одно из них - система выберет). Если вы пытаетесь присоединится к адресу не из вашей сети, то пакет будет отправлен в gateway (ну или туда, куда отруководит таблица роутинга). Если IP назначения принадлежит одной из ваших сетей - пакет будет отправлен напрямую на сервер с локального сокета, который получит адрес в этой самой сети (ну или если он уже имел такой адрес) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 14 ноября, 2017 Опубликовано 14 ноября, 2017 · Жалоба XVR спасибо за инф. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться