Добрый день!
QNX6.5.0 sp1
При попытке bind с одинаковым адресом и портом выдает ошибку "Address already in use".
struct sockaddr_in snd_addr;
snd_addr.sin_family = AF_INET;
#ifdef WIN32
int addr_len = sizeof( struct sockaddr_in );
snd_addr.sin_addr.S_un.S_addr =
qToBigEndian< quint32 >( m_hostLocal.toIPv4Address() );
#else // #ifdef WIN32
socklen_t addr_len = sizeof( struct sockaddr_in );
snd_addr.sin_addr.s_addr =
qToBigEndian< quint32 >( m_hostLocal.toIPv4Address() );
#endif // #ifdef WIN32
snd_addr.sin_port = qToBigEndian< quint16 >( m_uiLocalPort );
int opt_val = 1;
if ( ::setsockopt( snd_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* )&opt_val, sizeof( opt_val ) ) != 0 )
{
qDebug()
<< "CUdpReceiverExt::initSock: SO_REUSEADDR error"
#ifdef WIN32
<< GetLastError();
#else // #ifdef WIN32
<< strerror( errno );
#endif // #ifdef WIN32
}
opt_val = 1;
if ( ::setsockopt( snd_sock, SOL_SOCKET, SO_REUSEPORT, ( const char* )&opt_val, sizeof( opt_val ) ) != 0 )
{
qDebug()
<< "CUdpReceiverExt::initSock: SO_REUSEPORT error"
#ifdef WIN32
<< GetLastError();
#else // #ifdef WIN32
<< strerror( errno );
#endif // #ifdef WIN32
}
opt_val = 1;
if ( ::setsockopt( snd_sock, SOL_SOCKET, SO_BROADCAST, ( const char* )&opt_val, sizeof( opt_val ) ) != 0 )
{
qDebug()
<< "CUdpTransmitter::initSock: SO_BROADCAST "
#ifdef WIN32
<< GetLastError();
#else // #ifdef WIN32
<< strerror( errno );
#endif // #ifdef WIN32
}
if( ::bind( snd_sock, ( const struct sockaddr* )&snd_addr, addr_len ) != 0 )
{
qDebug()
<< "CUdpTransmitter::setBind: bind error "
#ifdef WIN32
<< GetLastError();
#else // #ifdef WIN32
<< strerror( errno );
#endif // #ifdef WIN32
}
else
{
qDebug()
<< "CUdpTransmitter::setBind:"
<< "successfully binded to"
<< m_hostLocal.toString( )
<< ":"
<< m_uiLocalPort
<< " remote address"
<< m_hostRemote.toString()
<< ":"
<< m_uiRemotePort;
}
На Suse 13.2 все работает.