Перейти к содержанию
    

Ну хорошо. Другой вопрос. Я в таске принимаю данные с сервера

mlen = read (soc_desc, read_buff, sizeof(read_buff));

у нас для чтения есть еще три функции

recvfrom( )
recv( )
recvmsg( )

какую лучше использовать? из описания я понял что recvfrom( ), recvmsg( ) - это для UDP, а recv( ) - для TCP.

так ли это или я ошибаюсь?

 

и потом я не понимаю как синхронизируется посылка-прием между клиентом и сервером. полингом я читаю данные которые давно уже отправлены. нет какого то флага или прерывания от сервера?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Создал сокет как TCP Client. Читаю с сервера, пишу на сервер, все нормально. Но если вытащили кабель или сервер захлопнулся - какие мои действия? Закрыть старый сокет и пытаться открыть новый все время в таске?

Как то не логично. Если связь упала то получается я ломлюсь в закрытую дверь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И какой вывод можно получить?

 

Что компьютер 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой девайс присоединен к двум другим. С одним он должен разговаривать по TCP с IP адресом X, с другим по UDP с IP адресом Y.

Физически там только один ETH канал.

Возможно определить два сокета TCP и UDP с разными IP адресами?

 

Я так понимаю нужно определить на уровне драйвера два IP адреса?

post-71075-1510492273_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой девайс присоединен к двум другим. С одним он должен разговаривать по 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-таблицу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте на PC

arp -s . . . .

arp -a

Маршрутизатор должен "знать" что на этот один MAC привязаны несколько IP

И естественно Ваш девайс должен уметь с ним (маршрутизатором или другим девайсом) "договориться" об этом автоматически.

копаюсь в коде. вижу что определение IP уходит в драйвер лэйер. но в линуксе все драйвера сидят в кернеле. по крайней мере я вижу только объектные файлы.

 

В камень заходят только TX+/TX-, RX+/RX-. Получается у него внутри и PHY и MAC. Получается все нужно конфигурировать внутри.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP).

Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение.

ps

Для PC/Linux оно должно быть, а вот для embedded - тут вопрос.

psps

Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ?

IMHO

а тема - IP aliasing :)

Насколько понял, настраивается методом прописки config-файлов Linux :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо вместо одного сетевого интерфейса (физического) сделать 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?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как задать что первый IP относиться к UDP , а второй IP к TCP?
Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то TCP/IP стек сам выберет нужный IP на основании того, куда вы их подключите

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то 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));

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, мой тезис по 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. В этом случае при организации

сокета надо указать, а на какой из них (интерфейсов) он будет работать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, мой тезис по alias ошибочен. Два адреса у одного Ethernet-интерфейса будут,

но по приему все будет "сыпать" в одну кучу (на один порт TCP/UDP будут попадать пакеты и для одного

алиасного IP и для другого) .

 

В Вашем посте выше

 

Если "раздвоить" физ. интерфейс (на ниженем уровне стека или вообще до него)

то задача решается "автоматически".

Как например, если было бы 2 физических Ethernet (интерфейса) и соотв-но 2 привязанных IP. В этом случае при организации

сокета надо указать, а на какой из них (интерфейсов) он будет работать.

а мне тут сказали что если делать байнд - два сокета на два разных IP то этого достаточно чтоб разделить потоки на транспортном уровне. даже не знаю, я не большой спец в этих вопросах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . . я не большой спец в этих вопросах.

Да я тоже не спец, скорее соискатель по теме.

Был небольшой опыт по работе с UDP в распределенной интранет.

--------

(0) Канальный уровень, насколько могу предположить, обеспечивается Ethernet фреймами == MAC.

(1) сетевой + транспортный == IP == интерфейс

(2) TCP, UDP, . . . .

 

между (0) и (1) еще много чего в виде сетевых протоколов нижнего уровня, в том числе ARP, SNMP.

 

(?) Может знающие подскажут.

bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов,

на который отсылается пакет ?

(например, порт 80, один сокет для приема, и n сокетов для каждого подключения ? )

Как bind работает при приеме ?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов,

на который отсылается пакет ?

Нет. bind дает вашему локальному сокету адрес. При приеме (когда сокет серверный) именно к этому адресу должны будут присоединяться клиенты (или посылать на него пакеты - например для UDP сокетов). Адрес однозначно определяет в какой сети находится ваш сервер. Система не даст присвоить IP сокету из другой сети.

При передаче все проще - система сама даст адрес сокету, если вы его не присвоили явно через bind. IP будет взято из вашей сети (если сетей несколько, то одно из них - система выберет). Если вы пытаетесь присоединится к адресу не из вашей сети, то пакет будет отправлен в gateway (ну или туда, куда отруководит таблица роутинга).

Если IP назначения принадлежит одной из ваших сетей - пакет будет отправлен напрямую на сервер с локального сокета, который получит адрес в этой самой сети (ну или если он уже имел такой адрес)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...