qtcpserver使用請見:qtcpsocket-qt使用tcp通訊實現服務端和客戶端
qtcpserver類預設提供的只有無引數的newconnection的訊號,這樣雖然知道有人連線了,並且可以通過nextpendingconnection獲取連線的socket,但並不便於管理,尤其是在連線斷開以後無法判斷具體那個斷開了,因為qtcpsocket只提供了無參的disconnected訊號。。。
這樣就算在newconnection是儲存乙個list或者map,也無法在disconnected是知道具體是那一項斷開連線,給不同的qtcpsocket的訊號指向不同的槽。
實際上socket有自己的控制代碼,並通過下述函式在初步連線時就賦予了對應的socketdescriptor
virtual void incomingconnection(qintptr socketdescriptor)
當有client連線時,首先是此方法被呼叫,可自行在此方法內建立qtcpsocket並將socketdescriptor值賦予socket,並在socket斷開時告知此識別符號
原始碼請見github:qtothermoduleexamples
tcp_server.h
#ifndef tcp_server_h
#define tcp_server_h
#include namespace tcp_server_private
class qtcpsocket;
/** * @brief tcp多客戶端伺服器
*/class tcpserver : public qtcpserver ;
#endif // tcp_server_h
tcp_server.cpp
#include "tcp_server.h"
#include "tcp_server_private.h"
//建構函式
tcpserver::tcpserver(qobject *parent)
: qtcpserver(parent),
private_(new tcp_server_private::tcpserverprivate)
//析構函式
tcpserver::~tcpserver()
if(private_)
delete private_;
this->close();
}//重寫-有連線到來
void tcpserver::incomingconnection(qintptr handle)
auto client_socket = new tcp_server_private::tcpsocket(handle);
q_assert(client_socket->socketdescriptor() == handle);
//socket斷開連線的訊號與server槽連線
connect(client_socket,
&tcp_server_private::tcpsocket::clientdisconnected,
this,
&tcpserver::clientdisconnectedslot);
//主動斷開連線的操作
connect(this,
&tcpserver::initiativedisconnectclient,
client_socket,
&tcp_server_private::tcpsocket::disconnectsocket);
//map記錄
private_->clients.insert(handle, client_socket);
qdebug()qdebug()#ifndef tcp_server_private_h
#define tcp_server_private_h
#include namespace tcp_server_private ;
/** * @brief tcp多客戶端伺服器私有類
*/class tcpserverprivate ;
}//tcp_server_private
#endif // tcp_server_private_h
//cpp
#include "tcp_server_private.h"
namespace tcp_server_private );
}//主動斷開連線槽
void tcpsocket::disconnectsocket(qintptr handle)
}
上述範例將tcpsocket定義在tcp_server_private命名空間不對外可見,且tcpserver返回值也是qtcpsocket,若需要繼承qtcpsocket做更多自定義需要將tcpsocket移出
coologic 部落格網域名稱已更改,已從 www.techieliang.com 改為
www.coologic.cn,上述鏈結位址受到影響,若需檢視源文請手動修改,多有不便,敬請諒解。
域套接字 多客戶端實現
我們在linux 應用開發中,如果需要實現程序間通訊的多客戶端介面,就需要引入select 和epoll 相關機制了,本文介紹下epoll的功能的實現。多客戶端使用場景,比如我們需要開發乙個庫介面,提供給客戶呼叫,那麼使用域套接字實現程序間通訊,就必須在service端引入多路復用,否則庫功能就只能...
C語言網路程式設計 TCP實現多執行緒實現多客戶端
tcp通訊的程式設計模型如下 tcp通訊是必須要有乙個伺服器,通過accept函式與客戶端socket進行三次握手連線建立的通訊描述符與客戶端進行資料傳輸。此時可以將accept函式的連線設定為多執行緒形式,輪訓監聽,每獲取到乙個客戶端的連線,則建立乙個子執行緒專門用於和該客戶端進行通訊。實現 如下...
SUMO Traci多客戶端執行
參考sumo官網教程 1 對於路網,路網內交通燈以及路網內的車輛交通 流 等的設定,請參考其他高手,這裡簡單描述如何使用sumo traci多客戶端控制sumo gui執行。2 sumo traci的多客戶端執行的優勢如 3 我這裡以兩個客戶端為例,實現sumo traci多客戶端執行。直接上 會更...