• 6986阅读
  • 7回复

多线程TCP通信,服务端怎么知道是哪一个客户端? [复制链接]

上一主题 下一主题
离线xfate
 
只看楼主 倒序阅读 楼主  发表于: 2011-09-16
void CTcpServer::incomingConnection(int socketDescriptor)
{
    TCPThread * thread = new TCPThread(socketDescriptor,this);
    
    thread->start();
}
在服务端的接受数据的函数中receive怎么知道要获取的是哪一个socket发过来的数据?希望大家帮忙。

离线zhengqingji
只看该作者 1楼 发表于: 2011-09-16
建个链表管理获取到的TCPSocket连接?
离线xfate
只看该作者 2楼 发表于: 2011-09-16
谢谢,我也有这个想法。
如果这样做的话,我是这样写的:
void CTcpServer::receive()
{
    TCPThread * client = m_clientList.last();
    QDataStream in(client);
    in.setVersion(QDataStream::Qt_4_5);
    //......

}
void CTcpServer::incomingConnection(int socketDescriptor)
{
    TCPThread * thread = new TCPThread(socketDescriptor,this);
    m_clientList.append(thread);
    connect(thread,SIGNAL(readyRead()),this,SLOT(receive()));
    connect(thread,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(errorMsg()));
    thread->start();
}
===============
如果这样可行的话,又有一个问题:
多线程tcp,每个客户端传来的数据大小都不一样,服务端应该怎么处理从而保证数据完整?单线程时可以用m_bytesReceived,m_totalbytes来保证接收信息完整,而在多线程是把这些数据放在TcpThread客户端里吗?
离线wxj120bw

只看该作者 3楼 发表于: 2011-09-17
回 2楼(xfate) 的帖子
既然是链表管理TcpSocket连接 那么数据也链表管理吧
离线siryang2006

只看该作者 4楼 发表于: 2012-03-05
获得信号发送源:QTcpSocket* ptcpSocket=dynamic_cast<QTcpSocket*>(sender());试试
离线condition

只看该作者 5楼 发表于: 2012-03-05
回 2楼(xfate) 的帖子
还可以在客户端发送的数据中加入识别数据,在服务器端解析来识别客户端。
离线dxfans

只看该作者 6楼 发表于: 2012-03-08
一个socket就是代表一个客户端。。
离线lipingping

只看该作者 7楼 发表于: 2012-04-27
我还是不太清楚,

void CTcpServer::receive()
{
    TCPThread * client = m_clientList.last();
    QDataStream in(client);
    in.setVersion(QDataStream::Qt_4_5);
    //......

}

TCPThread * client = m_clientList.last();怎么解释?
多线程可以接收服务器发来的数据吗?
学海无涯
快速回复
限100 字节
 
上一个 下一个