Tôi có một QTcpSocket và tôi đang đọc thành một vòng lặp. Mỗi lần một gói đầy đủ đã được đọc, hoặc đã có một lỗi, tôi tự kiểm tra tình trạng của ổ cắm bên trong vòng lặp, với:Trạng thái QTcpSocket luôn được kết nối, thậm chí rút dây ethernet
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
Khi tôi thực hiện de chương trình, một khi được kết nối và vòng lặp khởi động, nó luôn luôn in qDebug()<<"Socket status: connected. Looking for packets..."
; và sau đó stucks tại waitForReadyRead
cho đến khi một số dữ liệu đã sẵn sàng để được đọc.
Vấn đề là việc ngắt kết nối không được phát hiện. Nếu tôi ngắt kết nối từ mạng từ các tùy chọn OS, hoặc thậm chí nếu tôi rút dây ethernet, nó hoạt động giống nhau: Socket state bằng QAbstractSocket::ConnectedStat
e, do đó, nó đi vào, nhưng không nhận được bất cứ điều gì tất nhiên.
Tôi cũng đã cố gắng để phát hiện ngắt kết nối kết nối disconnected()
tín hiệu (sau khi kết nối nắm tay) đến một chức năng kết nối lại:
// Detect disconnection in order to reconnect
connect(socket, SIGNAL(disconnected()), this, SLOT(reconnect()));
void MyClass::reconnect(){
qDebug()<<"Signal DISCONNECTED emitted. Now trying to reconnect";
panelGUI->mostrarValueOffline();
socket->close();
prepareSocket((Global::directionIPSerialServer).toLocal8Bit().data(), 8008, socket);
qDebug()<<"Reconnected? Status: "<<socket->state();
}
Nhưng tín hiệu không bao giờ emited, bởi vì mã này không bao giờ được thực thi. Đó là hợp lý, vì nó trông giống như trạng thái socket luôn là ConnectedState
.
Nếu tôi cắm lại, kết nối sẽ được khôi phục và bắt đầu nhận lại dữ liệu, nhưng tôi muốn phát hiện các ngắt kết nối để hiển thị "Đã ngắt kết nối" tại GUI.
Tại sao QTcpSocket hoạt động theo cách này và cách tôi có thể giải quyết vấn đề này?
EDIT: Tôi đang tạo ổ cắm tại các nhà xây dựng lớp học, và sau đó initialising gọi prepareSocket chức năng:
socket = new QTcpSocket();
socket->moveToThread(this);
bool prepareSocket(QString address, int port, QTcpSocket *socket) {
socket->connectToHost(address, port);
if(!socket->waitForConnected(2000)){
qDebug()<<"Error creating socket: "<<socket->errorString();
sleep(1);
return false;
}
return true;
}
Bạn đã đợi bao lâu bằng cáp chưa cắm? – Mat
Không biết ... 10 giây? Ít hơn là cần thiết cho các ổ cắm POSIX để xác định chúng đã bị ngắt kết nối. Tôi nên đợi bao lâu? –
Thời gian chờ TCP là cách trên đó. Đợi ít nhất vài phút. – Mat