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