Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: W5100+AVR. Один сервер - много клиентов.
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
Androliz
В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту. Таким образом все клиенты могут стучаться к одному серверу и получать положительный ответ на один и тот же порт. Как можно это реализовать на визнете?
MALLOY2
Цитата(Androliz @ Mar 21 2008, 18:15) *
В W5100+AVR создаётся сокет в режиме сервера. К нему подключается 1 клиент. Другой клиент в это время к нему подключиться не может. В ПК это реализованно программно так, что если к серверу подключается клиент, то он переводится на другой порт, а свободный слушающий сервер остаётся на исходном порту. Таким образом все клиенты могут стучаться к одному серверу и получать положительный ответ на один и тот же порт. Как можно это реализовать на визнете?


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

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


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


Это если UDP, для TCP выделяется новое соеденение.
uriy
Цитата
Аппаратно никак, но можно его переключить в режим 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), но уникальный для каждого клиента.
Itch
А если 4 клиента мало?
Кстати, в RAW моде при переполнении внутренних буферов wiznet будет их перезаписывать по кругу новыми данными?
nicks80
Цитата(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;
};
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.