Получилось забиндиться по разным сетевым картам, код ниже, но не получаю события при потере связи (если выдергиваю шнурок с карты)
void QRawClient::connectToServer()
{
if(fsocket.state() != QAbstractSocket::UnconnectedState) return;
fmustReconnect = true;
if(connectionConfig().interfaceIndex()>=0)
{
if(!fbindAddress.isNull()) //если биндинг задан, создаем сокет посредством Qt
{
qDebug("Try bind %i:%s to %s",connectionConfig().interfaceIndex(),qPrintable(connectionConfig().host()),qPrintable(fbindAddress.toString()));
int fd = fsocket.socketDescriptor();
if(fd<0)
{
fd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
}
struct sockaddr_in bindAddr;
memset(&bindAddr,0,sizeof(bindAddr));
bindAddr.sin_family = PF_INET;
bindAddr.sin_addr.s_addr = htonl(fbindAddress.toIPv4Address());
if(bind(fd,(const struct sockaddr *)&bindAddr,sizeof(bindAddr))!=0)
{
qDebug("Socket bind to %s failed with reason %s",qPrintable(fbindAddress.toString()),strerror(errno));
shutdown(fd,2);
#ifdef Q_WS_WIN32
closesocket(fd);
#else
close(fd);
return;
#endif
}
struct sockaddr_in connect_addr;
memset(&connect_addr,0,sizeof(connect_addr));
connect_addr.sin_family = PF_INET;
connect_addr.sin_port = htons(connectionConfig().port());
QHostAddress address(connectionConfig().host());
connect_addr.sin_addr.s_addr = htonl(address.toIPv4Address());
int connect_result = ::connect(fd,(const struct sockaddr *)&connect_addr,sizeof(connect_addr));
qDebug("connect result %i",connect_result);
if(connect_result==-1)
{
qDebug("connect error! %s",strerror(errno));
close(fd);
return;
}
else
{
bool bind_result = fsocket.setSocketDescriptor(fd,QAbstractSocket::ConnectedState);
if(!bind_result)
qDebug("binding to native socket failed");
else
qDebug("binding to native socket succsseeded");
emit connectedToServer();
}
//fsocket.connectToHost(connectionConfig().host(),connectionConfig().port());
}
}
}
На ноуте где одна сетевая, при выдергивании сетевой я получаю событие о потере связи, а на двух сетевых нет...