Здравствуйте. Мне нужно получить адрес подключившегося клиента из пришедшей датаграммы. Делаю я это вот так:
| Код | char* buf = new char[255];
sockaddr_in client_addr; socklen_t client_addr_len; buf[recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )] = '\0'; printf( "Client address: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port) );
|
Но вместо адреса вижу четыре нолика(.
Клиентом подключаюсь с этого же компа по адресу в локалке (192.168.1.2). Сами данные из сообщений нормально получаются и работают.
Вот задействованный в этом процессе код сервера:
| Код | //Network.hpp: namespace Network { class Socket { public: Socket ( void ); ~Socket ( void ); void listen ( unsigned short int port ); protected: int sock; sockaddr_in addr; event evt; bool listened; }; void onSocketData ( int sock, short int evt, void *arg ); } //Network.cpp: namespace Network { Socket::Socket( void ) { sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( sock == -1 ) Console::warn( "Socket not created." );
memset( (char *) &addr, 0, sizeof(addr) ); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY);
listened = false; }
Socket::~Socket( void ) { if ( listened ) event_del( &evt );
close( sock ); }
void Socket::listen( unsigned short int port ) { Console::debug( "Listening." );
addr.sin_port = htons( port );
if ( bind( sock, (sockaddr*)&addr, sizeof(sockaddr_in) ) == -1) Console::warn( "Listening failed." );
if ( ! listened ) { event_set( &evt , sock, EV_READ|EV_PERSIST, onSocketData, this ); event_add( &evt, NULL ); listened = true; } }
void onSocketData(int sock, short int event, void *arg) { char* buf = new char[255];
sockaddr_in client_addr; socklen_t client_addr_len; buf[recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )] = '\0'; printf( "Client address: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port) ); Console::log( buf ); } } //main.cpp: int main( int argc, char** argv ) { event_init();
Network::Socket socket; socket.listen( 9930 );
while(1) { event_loop( EVLOOP_NONBLOCK ); }
return 0; }
|
Вопрос: что я делаю не так? =/ |