реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Работа с сокетами.
Jenya7
сообщение Sep 17 2017, 06:01
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Ну хорошо. Другой вопрос. Я в таске принимаю данные с сервера
Код
mlen = read (soc_desc, read_buff, sizeof(read_buff));

у нас для чтения есть еще три функции
Код
recvfrom( )
recv( )
recvmsg( )

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

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

Сообщение отредактировал Jenya7 - Sep 17 2017, 09:56
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 31 2017, 08:45
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Создал сокет как TCP Client. Читаю с сервера, пишу на сервер, все нормально. Но если вытащили кабель или сервер захлопнулся - какие мои действия? Закрыть старый сокет и пытаться открыть новый все время в таске?
Как то не логично. Если связь упала то получается я ломлюсь в закрытую дверь.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 4 2017, 02:19
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(des333 @ Sep 13 2017, 18:59) *
И какой вывод можно получить?


Что компьютер 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
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 12 2017, 13:11
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

Сообщение отредактировал Jenya7 - Nov 12 2017, 14:23
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 12 2017, 14:25
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Nov 12 2017, 17:11) *
Мой девайс присоединен к двум другим. С одним он должен разговаривать по 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-таблицу.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 12 2017, 14:30
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 12 2017, 20:25) *
Попробуйте на PC
arp -s . . . .
arp -a
Маршрутизатор должен "знать" что на этот один MAC привязаны несколько IP
И естественно Ваш девайс должен уметь с ним (маршрутизатором или другим девайсом) "договориться" об этом автоматически.

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

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

Сообщение отредактировал Jenya7 - Nov 12 2017, 14:44
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 12 2017, 14:53
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP).
Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение.
ps
Для PC/Linux оно должно быть, а вот для embedded - тут вопрос.
psps
Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ?
IMHO
а тема - IP aliasing sm.gif
Насколько понял, настраивается методом прописки config-файлов Linux sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 12 2017, 15:23
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 12 2017, 20:53) *
Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP).
Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение.
ps
Для PC/Linux оно должно быть, а вот для embedded - тут вопрос.
psps
Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ?
IMHO
а тема - IP aliasing sm.gif
Насколько понял, настраивается методом прописки config-файлов Linux sm.gif

есть конфигурационные хедеры но там ни слова об 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 - Nov 12 2017, 15:57
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 13 2017, 10:47
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Jenya7 @ Nov 12 2017, 18:23) *
а как задать что первый IP относиться к UDP , а второй IP к TCP?
Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то TCP/IP стек сам выберет нужный IP на основании того, куда вы их подключите

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 14 2017, 06:51
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(XVR @ Nov 13 2017, 15:47) *
Никак, да это и не нужно. Когда вы будете устанавливать соединения с клиентами, то 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 - Nov 14 2017, 06:52
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 14 2017, 08:24
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Да, мой тезис по 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. В этом случае при организации
сокета надо указать, а на какой из них (интерфейсов) он будет работать.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 14 2017, 09:21
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Nov 14 2017, 13:24) *
Да, мой тезис по alias ошибочен. Два адреса у одного Ethernet-интерфейса будут,
но по приему все будет "сыпать" в одну кучу (на один порт TCP/UDP будут попадать пакеты и для одного
алиасного IP и для другого) .

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

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

а мне тут сказали что если делать байнд - два сокета на два разных IP то этого достаточно чтоб разделить потоки на транспортном уровне. даже не знаю, я не большой спец в этих вопросах.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 14 2017, 11:53
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Nov 14 2017, 13:21) *
. . . я не большой спец в этих вопросах.

Да я тоже не спец, скорее соискатель по теме.
Был небольшой опыт по работе с UDP в распределенной интранет.
--------
(0) Канальный уровень, насколько могу предположить, обеспечивается Ethernet фреймами == MAC.
(1) сетевой + транспортный == IP == интерфейс
(2) TCP, UDP, . . . .

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

(?) Может знающие подскажут.
bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов,
на который отсылается пакет ?
(например, порт 80, один сокет для приема, и n сокетов для каждого подключения ? )
Как bind работает при приеме ?



Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 14 2017, 12:11
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
bind используется, когда есть несколько открытых сокетов для для передачи, - для указания IP адресов,
на который отсылается пакет ?
Нет. bind дает вашему локальному сокету адрес. При приеме (когда сокет серверный) именно к этому адресу должны будут присоединяться клиенты (или посылать на него пакеты - например для UDP сокетов). Адрес однозначно определяет в какой сети находится ваш сервер. Система не даст присвоить IP сокету из другой сети.
При передаче все проще - система сама даст адрес сокету, если вы его не присвоили явно через bind. IP будет взято из вашей сети (если сетей несколько, то одно из них - система выберет). Если вы пытаетесь присоединится к адресу не из вашей сети, то пакет будет отправлен в gateway (ну или туда, куда отруководит таблица роутинга).
Если IP назначения принадлежит одной из ваших сетей - пакет будет отправлен напрямую на сервер с локального сокета, который получит адрес в этой самой сети (ну или если он уже имел такой адрес)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 14 2017, 12:20
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



XVR спасибо за инф.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 21:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016