2010-07-04 2 views
0

Qt에서 서버/클라이언트를 만들려고합니다.서버/클라이언트를 만들려고하는데 신호와 슬롯을 연결하는 방법을 모르겠습니다.

TCP 서버는 클라이언트로부터 최대 4 개의 연결을 사용합니다. 이 코드는 deleteLater() 로 분리() 신호를 연결하여 메모리를 삭제할 것입니다하지만 난 목록에서 포인터를 제거하는 방법을 모르는

// server.h 
class Server : public QTcpServer{ 
    ... 
    QList<QTcpSocket *> list; 
} 

// server.cpp 
Server::start(){ 
    QTcpSocket *curr = nextPendingConnection(); 
    connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater())); 
    list.append(curr); 
} 

만들려면 .... 어떤 연결이 닫혔는지 어떻게 알 수 있습니까?

연결을 관리하기 위해 연결이 끊어진 QTcpSocket 포인터 요소를 목록에서 제거하고 싶습니다.

도와주세요 ...

(나는 (QTcpSocket *)) 분리 신호 (이 있다면 생각이 너무 쉽게해야합니다)

답변

0

는 QObject를 :: 보낸 사람

Server::start(){ 
    QTcpSocket *curr = nextPendingConnection(); 
    connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater())); 
    connect(curr, SIGNAL(disconnected()), this, SLOT(onDisconection())); 
    list.append(curr); 
} 

void onDisconection() 
{ 
    list.removeOne(qobject_cast<QTcpSocket*>(sender())); 
} 

작동합니다 지적했지만으로는 보낸 사람이 몇 가지 단점을 가지고 있으며, 당신이 슬롯에있는 경우 개체를 삭제하지 http://doc.qt.io/qt-5/qsignalmapper.html

+0

신호 매퍼에 대한 추가 정보를 가져 주셔서 감사합니다. 이게 내가 찾고 있었던거야. – nzer0

0

당신은 사용할 수 QObject::sender() :

void onDisconnect() 
{ 
    QTcpSocket sock = qobject_cast<QTcpSocket*>(sender()); 

    if (sock != 0) 
    { 
     list.removeAll(sock); 
     sock->deleteLater(); 
    } 
} 

이 슬롯을 disconnected() 신호에 연결하기 만하면 메모리가 해제되고 소켓이 목록에서 제거됩니다.

그러나 sender()을 사용하면 몇 가지 단점이 있습니다. 그것을 사용하기 전에 docs을 읽는 것이 좋습니다. 다른 사람들처럼

+1

절대 참조 신호 매퍼를 사용하는 것이 좋습니다 말했다 개체에 동기식으로 연결됩니다. QTcpSocket의 코드는 disconnected()를 발생시킨 후 계속 작업을 수행 한 다음 "this"가 이미 삭제 되었기 때문에 충돌 할 수 있습니다. deleteLater()를 사용하는 것이 좋습니다. –

+0

@ 프랭크 : 좋은 지적, 대답을 수정했습니다. – Job

관련 문제