2014-09-24 3 views
0

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

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

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

+1

Почему вы не используете функцию qt 'setSocketOption' для этого? –

ответ

2

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

Гнездо дескриптора не доступна, когда QAbstractSocket в UnconnectedState.

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

+0

Кажется работать ... Я думаю, что документация Qt неясно. – TSG