8 #include <sys/socket.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include "Listener.hpp"
17 // Discover machine's IP address
19 gethostname( buf
, 128 );
22 if( ( h
= gethostbyname( buf
) ) == (void*)-1 )
24 throw strerror( errno
);
26 m_ipaddr
= inet_ntoa( *((in_addr
*)h
->h_addr
) );
33 std::cout
<< "[Listener] Closing socket" << std::endl
;
38 void Listener::Listen()
40 std::cout
<< "[Listener] Opening socket" << std::endl
;
42 if( ( m_sock
= socket( PF_INET
, SOCK_STREAM
, 0 ) ) == -1 )
44 throw strerror( errno
);
47 // Set socket to non-blocking
48 if( fcntl( m_sock
, F_SETFL
, O_NONBLOCK
) == -1 )
50 throw strerror( errno
);
55 if( setsockopt( m_sock
, SOL_SOCKET
, SO_REUSEADDR
, &yes
, sizeof( int ) ) == -1 )
57 throw strerror( errno
);
61 addr
.sin_family
= AF_INET
;
62 addr
.sin_port
= htons( 21 );
63 addr
.sin_addr
.s_addr
= inet_addr( m_ipaddr
.c_str() );
64 memset( addr
.sin_zero
, 0, sizeof( addr
.sin_zero
) );
66 if( bind( m_sock
, (sockaddr
*)&addr
, sizeof( addr
) ) == -1 )
68 throw strerror( errno
);
71 if( listen( m_sock
, 5 ) == -1 )
73 throw strerror( errno
);
79 // Check if there are some incoming connections
81 socklen_t size
= sizeof( addr
);
83 int incoming
= accept( m_sock
, (sockaddr
*)&addr
, &size
);
88 // No error, just no connections in queue
91 throw strerror( errno
);
94 ServerPtr server
= m_server
.lock();
97 throw "Listener lost server";
99 server
->IncomingConnection( incoming
);