Winsock needs to be initialized.
[dftpd.git] / Listener.cpp
blob1f1756374b1e9802948d5cbd540792e3141083bf
1 #ifdef _WIN32
2 #include <winsock.h>
3 typedef int socklen_t;
4 #else
5 #include <netdb.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include <netinet/in.h>
9 #include <arpa/inet.h>
10 #endif
12 #include <iostream>
13 #include <string.h>
14 #include <unistd.h>
15 #include <errno.h>
16 #include <fcntl.h>
17 #include "Listener.hpp"
18 #include "Server.hpp"
19 #include "Log.hpp"
20 #include "Exceptions.hpp"
22 Listener::Listener()
23 : m_sock( 0 )
25 #ifdef _WIN32
26 WSADATA wsaData;
27 WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
28 #endif
30 // Discover machine's IP address
31 char buf[128];
32 gethostname( buf, 128 );
34 hostent* h;
35 if( ( h = gethostbyname( buf ) ) == (void*)-1 )
37 g_log->Print( strerror( errno ) );
38 throw ServerCrashException;
40 m_ipaddr = inet_ntoa( *((in_addr*)h->h_addr) );
43 Listener::Listener( const std::string& ip )
44 : m_sock( 0 )
45 , m_ipaddr( ip )
49 Listener::~Listener()
51 if( m_sock != 0 )
53 g_log->Print( "[Listener] Closing socket" );
54 close( m_sock );
58 void Listener::Listen()
60 g_log->Print( "[Listener] Opening socket" );
62 if( ( m_sock = socket( PF_INET, SOCK_STREAM, 0 ) ) == -1 )
64 g_log->Print( strerror( errno ) );
65 throw ServerCrashException;
68 // Reuse port
69 #ifdef _WIN32
70 char yes = 1;
71 #else
72 int yes = 1;
73 #endif
74 if( setsockopt( m_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( int ) ) == -1 )
76 g_log->Print( strerror( errno ) );
77 throw ServerCrashException;
80 sockaddr_in addr;
81 addr.sin_family = AF_INET;
82 addr.sin_port = htons( 21 );
83 addr.sin_addr.s_addr = inet_addr( m_ipaddr.c_str() );
84 memset( addr.sin_zero, 0, sizeof( addr.sin_zero ) );
86 if( bind( m_sock, (sockaddr*)&addr, sizeof( addr ) ) == -1 )
88 g_log->Print( strerror( errno ) );
89 throw ServerCrashException;
92 if( listen( m_sock, 5 ) == -1 )
94 g_log->Print( strerror( errno ) );
95 throw ServerCrashException;
99 void Listener::Tick()
101 // Check if there are some incoming connections
102 sockaddr_in addr;
103 socklen_t size = sizeof( addr );
105 int incoming = accept( m_sock, (sockaddr*)&addr, &size );
106 if( incoming == -1 )
108 g_log->Print( strerror( errno ) );
109 throw ServerCrashException;
112 ServerPtr server = m_server.lock();
113 server->IncomingConnection( incoming );