Установить сокет QTcpSocket

Я создаю приложение Linux C++/Qt5, которое открывает сокет TCP для исходящего соединения (на удаленный сервер). Я создаю QTcpSocket, а затем пытаюсь установить параметры sockopt следующим образом:

m_tcpSocket = new QTcpSocket(this);
int fd = m_tcpSocket->socketDescriptor();
int enableKeepAlive = 1;  // Enable
if ( setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive)) != 0)
    reportsockoptError("SOL_SOCKET","SO_KEEPALIVE");

К сожалению, мой setsockopt не работает с ошибкой «Неверный файловый дескриптор», потому что m_tcpSocket->socketDescriptor() возвращает -1. Как получить дескриптор сокета для исходящего сокета перед его подключением? Или это нужно делать ПОСЛЕ подключения? (что, похоже, противоречит тому, что я понимаю из документов Qt)

Вышеприведенное отлично работает для прослушивающего сокета (QTcpServer).... только не для QTcpSocket.


person TSG    schedule 24.09.2014    source источник
comment
Почему бы вам не использовать для этого функцию qt setSocketOption?   -  person Геннадий Казачё&    schedule 24.09.2014


Ответы (1)


Из документации QAbstractSocket

Дескриптор сокета недоступен, когда QAbstractSocket находится в состоянии UnconnectedState.

Итак, перед вызовом socketDescriptor вы должны изменить внутреннее состояние сокета TCP. В случае с клиентским сокетом вам, вероятно, нужно подключить его к серверу, тем самым передав его ConnectedState.

person epsilon    schedule 24.09.2014
comment
Кажется, работает ... Я думаю, что документация Qt неясна по этому поводу. - person TSG; 25.09.2014