2014-09-24 81 views
0

我正在創建一個Linux C++/Qt5應用程序,它爲出站連接(到遠程服務器)打開一個TCP套接字。我創建了一個與QTcpSocket,然後嘗試設置sockopt的選項如下:設置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。

+1

爲什麼你不使用qt函數'setSocketOption'呢? – 2014-09-24 09:57:04

回答

2

從QAbstractSocket文檔

套接字描述不可用時QAbstractSocket是 UnconnectedState。

因此,在調用socketDescriptor之前,應該更改TCP套接字的內部狀態。在客戶端套接字的情況下,您可能需要將其連接到服務器,從而將其傳遞到ConnectedState

+0

似乎工作......我認爲這個Qt文檔不清楚。 – TSG 2014-09-25 02:03:41