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

 
 
> W5100+AVR. Один сервер - много клиентов., Как можно реализовать подключение нескольких клиентов к одному серверу
Androliz
сообщение Mar 21 2008, 14:15
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 22-09-06
Из: Беларусь
Пользователь №: 20 595



В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту. Таким образом все клиенты могут стучаться к одному серверу и получать положительный ответ на один и тот же порт. Как можно это реализовать на визнете?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
MALLOY2
сообщение Apr 1 2008, 08:31
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата(Androliz @ Mar 21 2008, 18:15) *
В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту. Таким образом все клиенты могут стучаться к одному серверу и получать положительный ответ на один и тот же порт. Как можно это реализовать на визнете?


Аппаратно никак, но можно его переключить в режим RAW а на AVR поднять TCP/IP стек типа mip, lwip, и т.д.
Go to the top of the page
 
+Quote Post
GL_basik
сообщение Apr 17 2008, 11:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 19-07-06
Пользователь №: 18 918



Цитата(MALLOY2 @ Apr 1 2008, 12:31) *
Аппаратно никак, но можно его переключить в режим RAW а на AVR поднять TCP/IP стек типа mip, lwip, и т.д.

и при хорошей нагрузке сети w5100 в режиме raw зависнет, потому что avr просто не успеет забирать информацию из буфера...
Go to the top of the page
 
+Quote Post
Quasar
сообщение Apr 24 2008, 21:26
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата
Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту.


Там ни чего ни куда не переводится, сервер идентифицирует клиента по Source Port'у. А все коннекты, как шли на открытый порт сервера, так и идут.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение May 13 2008, 06:15
Сообщение #5


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Там ни чего ни куда не переводится, сервер идентифицирует клиента по Source Port'у. А все коннекты, как шли на открытый порт сервера, так и идут.


Это если UDP, для TCP выделяется новое соеденение.
Go to the top of the page
 
+Quote Post
uriy
сообщение May 13 2008, 08:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
Аппаратно никак, но можно его переключить в режим RAW а на AVR поднять TCP/IP стек типа mip, lwip, и т.д.
Не правда. Это лего проверить на отладочной плате efo.ru/doc/Wiznet/Wiznet.pl?2675.
Цитата
Там ни чего ни куда не переводится, сервер идентифицирует клиента по Source Port'у. А все коннекты, как шли на открытый порт сервера, так и идут.
Совершенно верно.
На вышеуказанной плате реализовано несклько служб. В частности web сервер с cgi. Имеется html страница для передачи и приема текста на LCD на плате и включения выключения светодиодов. Подключал до 4 клиентов, все могли работать одновременно. Плата выдает служебную информацию через UART. Там указыавется Source и Destination порт. Для HTTP по умолчанию Source порт 80, а Destination любой (вроде всегда отличный от 80), но уникальный для каждого клиента.
Go to the top of the page
 
+Quote Post
Itch
сообщение May 13 2008, 09:21
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 358
Регистрация: 27-06-06
Из: Новосибирск
Пользователь №: 18 410



А если 4 клиента мало?
Кстати, в RAW моде при переполнении внутренних буферов wiznet будет их перезаписывать по кругу новыми данными?
Go to the top of the page
 
+Quote Post
nicks80
сообщение Dec 11 2008, 16:06
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 18-10-07
Пользователь №: 31 485



Цитата(Androliz @ Mar 21 2008, 17:15) *
В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту. Таким образом все клиенты могут стучаться к одному серверу и получать положительный ответ на один и тот же порт. Как можно это реализовать на визнете?

>>В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в >>это время к нему подключиться не может.
Создай еще соединение в момент подключения нового клиента. с таким же портом.
ты сможеш максимум 4 клиента создать иначе закрывать новые придется.

вот как я решал это все крутьилось в цикле с опросом состояния байта lanserv_transfer_state для выявления эскейп последовательностей.
Я закрывал сокет тебе не надо закрывать!


switch(lanserv_transfer_state)
{
case LANSERV_STATE_INIT_SERVER_SOCKET:
socket(active_socket_server,Sn_MR_TCP,PORT_SERVER,0);
lanserv_transfer_state = LANSERV_STATE_LISTEN_CLIENT;
break;
case LANSERV_STATE_LISTEN_CLIENT:
listen(active_socket_server);
lanserv_transfer_state = LANSERV_STATE_WAIT_CLIENT;
break;
case LANSERV_STATE_WAIT_CLIENT:
if(getSn_SR(active_socket_server)==SOCK_LISTEN)
{
}
else
{
if(active_socket_server == SOCKET_SERVER)
{
socket(SOCKET_SERVER2,Sn_MR_TCP,PORT_SERVER2,0);
listen(SOCKET_SERVER2);
}
else
{
socket(SOCKET_SERVER,Sn_MR_TCP,PORT_SERVER,0);
listen(SOCKET_SERVER);
}

lanserv_transfer_state = LANSERV_STATE_GET_IP_CLIENT;
ticks_keep_connection_sec = 0;
read_recive_state = 0;
bufsend_count = 0;
}
break;
case LANSERV_STATE_GET_IP_CLIENT:
for(tmp1=0;tmp1<4;tmp1++) /// GetIP
{
cc = IINCHIP_READ(Sn_DIPR0(active_socket_server)+tmp1);
if( cc != lanserv_client_ip[tmp1])
{
EEPROM_write(EEP_IP_DEST_OFS+tmp1,cc);
lanserv_client_ip[tmp1] = cc;
}
}
lanserv_transfer_state = LANSERV_STATE_CONNECTION_ESTABLISHED;
break;
case LANSERV_STATE_CONNECTION_ESTABLISHED:
if(active_socket_server == SOCKET_SERVER)
{
if(getSn_SR(SOCKET_SERVER2)==SOCK_LISTEN)
{
}
else
{
disconnect(active_socket_server);
close(active_socket_server);
active_socket_server = SOCKET_SERVER2;
lanserv_transfer_state = LANSERV_STATE_WAIT_CLIENT;
return;
}

}
else
{
if(getSn_SR(SOCKET_SERVER)==SOCK_LISTEN)
{
}
else
{
disconnect(active_socket_server);
close(active_socket_server);
active_socket_server = SOCKET_SERVER;
lanserv_transfer_state = LANSERV_STATE_WAIT_CLIENT;
return;
}
}


if(getSn_RX_RSR(active_socket_server)>0)
{
ticks_keep_connection_sec = 0;
lanserv_transfer_state = LANSERV_STATE_CONNECTION_RECIVE;
}
else
{
//lanserv_transfer_state = LANSERV_STATE_CONNECTION_ESTABLISHED;

}
break;
case LANSERV_STATE_CONNECTION_RECIVE:
{

EnableLED2Green(1);


read_byte=0;
recv(active_socket_server,&read_byte,1); /// 80 mks / 10mhz
ticks_keep_connection_sec = 0;
lanserv_transfer_state = LANSERV_STATE_CONNECTION_ESTABLISHED;

};
break;
case LANSERV_STATE_SEND_REQUEST:
{
//mcu_test_on();
ticks_after_last_transfer=0;
send(active_socket_server,LanServBuffer,LanServBufferCount);
lanserv_transfer_state = LANSERV_STATE_CONNECTION_ESTABLISHED;
};
break;
case LANSERV_STATE_QUERY_DISCONECT:
if(getSn_SR(active_socket_server)==SOCK_ESTABLISHED)
{
ticks_keep_connection_sec = 0;
lanserv_transfer_state = LANSERV_STATE_INIT_SERVER_SOCKET;

}
disconnect(active_socket_server);
close(active_socket_server);
ticks_keep_connection_sec = 0;
lanserv_transfer_state = LANSERV_STATE_INIT_SERVER_SOCKET;
break;
};
}

Сообщение отредактировал nicks80 - Dec 11 2008, 16:17
Go to the top of the page
 
+Quote Post

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

 


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


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