Цитата(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