2011-02-23 21:47:18 +01:00
# include "w5100.h"
# include "socket.h"
2010-03-30 20:09:55 +02:00
extern " C " {
2011-02-23 21:47:18 +01:00
# include "string.h"
2010-03-30 20:09:55 +02:00
}
# include "Ethernet.h"
# include "Client.h"
# include "Server.h"
Server : : Server ( uint16_t port )
{
_port = port ;
}
void Server : : begin ( )
{
for ( int sock = 0 ; sock < MAX_SOCK_NUM ; sock + + ) {
Client client ( sock ) ;
2011-02-23 21:47:18 +01:00
if ( client . status ( ) = = SnSR : : CLOSED ) {
socket ( sock , SnMR : : TCP , _port , 0 ) ;
2010-03-30 20:09:55 +02:00
listen ( sock ) ;
EthernetClass : : _server_port [ sock ] = _port ;
break ;
}
}
}
void Server : : accept ( )
{
int listening = 0 ;
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
for ( int sock = 0 ; sock < MAX_SOCK_NUM ; sock + + ) {
Client client ( sock ) ;
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
if ( EthernetClass : : _server_port [ sock ] = = _port ) {
2011-02-23 21:47:18 +01:00
if ( client . status ( ) = = SnSR : : LISTEN ) {
2010-03-30 20:09:55 +02:00
listening = 1 ;
2011-02-23 21:47:18 +01:00
}
else if ( client . status ( ) = = SnSR : : CLOSE_WAIT & & ! client . available ( ) ) {
2010-03-30 20:09:55 +02:00
client . stop ( ) ;
}
}
}
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
if ( ! listening ) {
begin ( ) ;
}
}
Client Server : : available ( )
{
accept ( ) ;
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
for ( int sock = 0 ; sock < MAX_SOCK_NUM ; sock + + ) {
Client client ( sock ) ;
if ( EthernetClass : : _server_port [ sock ] = = _port & &
2011-02-23 21:47:18 +01:00
( client . status ( ) = = SnSR : : ESTABLISHED | |
client . status ( ) = = SnSR : : CLOSE_WAIT ) ) {
2010-03-30 20:09:55 +02:00
if ( client . available ( ) ) {
// XXX: don't always pick the lowest numbered socket.
return client ;
}
}
}
2011-02-23 21:47:18 +01:00
return Client ( MAX_SOCK_NUM ) ;
2010-03-30 20:09:55 +02:00
}
void Server : : write ( uint8_t b )
{
write ( & b , 1 ) ;
}
void Server : : write ( const char * str )
{
write ( ( const uint8_t * ) str , strlen ( str ) ) ;
}
void Server : : write ( const uint8_t * buffer , size_t size )
{
accept ( ) ;
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
for ( int sock = 0 ; sock < MAX_SOCK_NUM ; sock + + ) {
Client client ( sock ) ;
2011-02-23 21:47:18 +01:00
2010-03-30 20:09:55 +02:00
if ( EthernetClass : : _server_port [ sock ] = = _port & &
2011-02-23 21:47:18 +01:00
client . status ( ) = = SnSR : : ESTABLISHED ) {
2010-03-30 20:09:55 +02:00
client . write ( buffer , size ) ;
}
}
}