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

|
Пишу на vxWorks но наверно это не важно. Принцип везде одинаков. Создаю сокет и пытаюсь подключиться к серверу. Сервером выступает компьютер. На компьютере запускаю Hercules -> TCP Server -> Port 8200 (SERVER_PORT_NUM) -> Listen. Сервер бежит. На стороне прибора Код STATUS TCP_ClientConnect (char *serverName, int *soc_desc) { struct sockaddr_in serverAddr; /* server's socket address */ int sockAddrSize; /* size of socket address structure */ int sFd; /* socket file descriptor */ /* create client's socket */ if ((sFd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR) { //perror ("socket"); printf ("SOCKET ERROR\n"); return (ERROR); } /* bind not required - port number is dynamic */ /* build server socket address */ sockAddrSize = sizeof (struct sockaddr_in); bzero ((char *) &serverAddr, sockAddrSize); serverAddr.sin_family = AF_INET; serverAddr.sin_len = (u_char) sockAddrSize; serverAddr.sin_port = htons (SERVER_PORT_NUM); if (((int)(serverAddr.sin_addr.s_addr = inet_addr (serverName)) == ERROR) && ((int)(serverAddr.sin_addr.s_addr = hostGetByName (serverName)) == ERROR)) { printf ("UNKNOWN SERVER NAME\n"); close (sFd); return (ERROR); } /* bind a port number to the socket */ if (bind(sFd, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) == ERROR) { printf("BIND ERROR\n"); return (ERROR); }
/* connect to server */ if (connect (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) != OK) { printf ("CONNECTION ERROR\n"); close (sFd); return (ERROR); } *soc_desc = sFd; return (OK); } И запускаю таск Код int socket_descriptor=0; char *server_ip = "10.0.0.80";
void tSpectraTaskEntryPoint() { if (TCP_ClientConnect(server_ip, &socket_descriptor)==ERROR) printf ("CLIENT CONNECT ERROR\n"); else printf("CLIENT CONNECT OK descriptor = %d\n", socket_descriptor); SpectraMain(); } Получаю ошибку BIND ERROR CLIENT CONNECT ERROR Значит не выполняется привязка сокета к серверу? Я что то не так делаю?
|
|
|
|
|
 |
Ответов
|
Nov 12 2017, 14:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Надо вместо одного сетевого интерфейса (физического) сделать 2 (виртуальных, с нужным IP). Для маршрутизаторного ПО (и в Linux ест-но) это должно быть готовое решение. ps Для PC/Linux оно должно быть, а вот для embedded - тут вопрос. psps Возможно, что такое решение умножит на 2 ресурсы, занимаемые стеком TCP. Влезет ? IMHO а тема - IP aliasing  Насколько понял, настраивается методом прописки config-файлов Linux
|
|
|
|
|
Nov 12 2017, 15: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  Насколько понял, настраивается методом прописки 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 - Nov 12 2017, 15:57
|
|
|
|
|
Nov 14 2017, 16:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Nov 12 2017, 18:23)  . . . тут возникает другой вопрос. допустим сконфигурировал Код //FIRST IP; ifAddrSet ("ETH0","10.0.0.10"); [b]IP для интерфейса, он "видится" маршрутизатором извне[/b] ifMaskSet ("ETH0", 0xffffff00); [b]маска. Отсюда видим, что для девайса выделена "минимальная" сеть на 254 (кажется) адреса[/b] //SECOND IP ifAddrAdd ("ETH0","192.168.101.100","192.168.101.255",0xffffff00); [b] (!) А вот тут я не уверен. Диапазон адресов из другой сети [/b]? . . . . Отсюда может быть и ошибка. ps Может виртуальный интерфейс (второй) Код sudo gedit /etc/network/interfaces И редактируешь его приводя к следующему виду: auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 dns-nameservers 8.8.8.8 192.168.1.1
auto eth0:1 iface eth0:1 inet static address 192.168.0.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.0.1 hwaddress ether 00269ebba619 --------------------- это похоже на "виртуальный" MAC dns-nameservers 8.8.8.8 192.168.1.1
|
|
|
|
Сообщений в этой теме
Jenya7 Работа с сокетами. Sep 13 2017, 13:35 Jenya7 модифицировал функцию чтоб выводить информацию.
Ко... Sep 13 2017, 14:45 des333 Цитата(Jenya7 @ Sep 13 2017, 17:45) перев... Sep 13 2017, 14:59  Tarbal Цитата(des333 @ Sep 13 2017, 18:59) И как... Nov 4 2017, 02:19 gerber Клиентский сокет можно не bind-ить, так как порт в... Sep 13 2017, 15:04 Jenya7 Цитата(gerber @ Sep 13 2017, 20:04) Клиен... Sep 13 2017, 15:09  gerber Цитата(Jenya7 @ Sep 13 2017, 18:09) но я ... Sep 13 2017, 15:42 Jenya7 Тут возникает такой вопрос. Если связь с сервером ... Sep 14 2017, 06:02 Эдди Все надо проверять. Здесь я намучился с этими черт... Sep 14 2017, 07:11 Jenya7 Цитата(Эдди @ Sep 14 2017, 12:11) Все над... Sep 14 2017, 07:21 Сергей Борщ Все уже придумано за нас. Почитайте про SO_KEEPALI... Sep 14 2017, 08:01 Jenya7 Цитата(Сергей Борщ @ Sep 14 2017, 13:01) ... Sep 14 2017, 09:35  Сергей Борщ QUOTE (Jenya7 @ Sep 14 2017, 12:35) а как... Sep 14 2017, 11:07   Jenya7 Цитата(Сергей Борщ @ Sep 14 2017, 16:07) ... Sep 14 2017, 11:19 gerber Если удаленный сервер корректно закрыл TCP-соедине... Sep 14 2017, 13:41 Jenya7 Цитата(gerber @ Sep 14 2017, 19:41) Если ... Sep 14 2017, 14:02 Jenya7 Ну хорошо. Другой вопрос. Я в таске принимаю данны... Sep 17 2017, 06:01 Jenya7 Создал сокет как TCP Client. Читаю с сервера, пишу... Oct 31 2017, 08:45 Jenya7 Мой девайс присоединен к двум другим. С одним он д... Nov 12 2017, 13:11 k155la3 Цитата(Jenya7 @ Nov 12 2017, 17:11) Мой д... Nov 12 2017, 14:25  Jenya7 Цитата(k155la3 @ Nov 12 2017, 20:25) Попр... Nov 12 2017, 14:30  XVR Цитата(Jenya7 @ Nov 12 2017, 18:23) а как... Nov 13 2017, 10:47   Jenya7 Цитата(XVR @ Nov 13 2017, 15:47) Никак, д... Nov 14 2017, 06:51 k155la3 Да, мой тезис по alias ошибочен. Два адреса у одно... Nov 14 2017, 08:24 Jenya7 Цитата(k155la3 @ Nov 14 2017, 13:24) Да, ... Nov 14 2017, 09:21  k155la3 Цитата(Jenya7 @ Nov 14 2017, 13:21) . . .... Nov 14 2017, 11:53 XVR Цитатаbind используется, когда есть несколько откр... Nov 14 2017, 12:11 Jenya7 Цитата(XVR @ Nov 14 2017, 18:11) Нет. bin... Nov 14 2017, 15:04 gosha-z Цитата(XVR @ Nov 14 2017, 15:11) Нет. bin... Nov 14 2017, 16:33 k155la3 XVR спасибо за инф. Nov 14 2017, 12:20 Jenya7 Продолжаю серию дурацких вопросов.
У меня NFS-серв... Nov 20 2017, 08:39 XVR ЦитатаТакое возможно?Переход по символической ссыл... Nov 20 2017, 10:46 Jenya7 Цитата(XVR @ Nov 20 2017, 16:46) Переход ... Nov 20 2017, 10:54 XVR Цитатая создаю папку на сервере - mkdir("/ram... Nov 20 2017, 12:35 Jenya7 Цитата(XVR @ Nov 20 2017, 18:35) Клиент у... Nov 20 2017, 12:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|