标题:使用QTcpSocket对象write出现段错误
作者:介农酥
日期:2019-05-12 15:23
内容:
程序(相关部分):
Server::Server(QObject *parent)
: QTcpServer(parent)
{
connect(this, SIGNAL(newConnection()),
this, SLOT(addSocketToList()));
}
void Server::addSocketToList()
{
qDebug() waitForBytesWritten();
}
备注:Server类继承QTcpServer。
结果:
难道说nextPendingConnection返回的对象指针不能在QTcpServer对象中使用?
其实我就是做一个聊天室的程序,,我把客户A的内容发给服务器,服务器发给其他客户端,比如B、C、D……(都在线程里),一两天都没想到办法,我好不容易网上看到有人把到来socket保存的QList中,然后一个个取出,才通过它们发到对应的客户端,可以当我write的时候就段错误,我真不知道什么原因(或者大家是怎么实现将客户A的聊天内容发给其他客户端(线程内))?
#1 [20091001753 05-12 23:05]
客户端 QTcpSocket ,服务端 QTcpSocket + QTcpServer
相互通讯的是两个 QTcpSocket ,而 QTcpServer 充当的角色是,类似于接待员。
#2 [介农酥 05-13 07:53]
怎样将一个客户端发给其他客户端
#3 回 20091001753 的帖子 [介农酥 05-13 07:53]
20091001753:客户端 QTcpSocket ,服务端 QTcpSocket + QTcpServer
相互通讯的是两个 QTcpSocket ,而 QTcpServer 充当的角色是,类似于接待员。
(2019-05-12 23:05)
怎样发给其他客户端
#4 [angelus 05-13 09:08]
基本都是这样中转服务器模式,大差不差,不过服务器一般用多线程处理,使用 void QTcpServer::incomingConnection(qintptr socketDescriptor) 函数,然后创建一个QHash保存键值对 方便进行索引,读写加锁。 根据A发的信息的对象id,取出指针,直接读写
你最好看下你取出的指针对象是否有效!
判断下 bool QAbstractSocket::isValid() const查看连接是否有效
或者
QAbstractSocket::SocketState QAbstractSocket::state() const
QAbstractSocket::ConnectingState 已连接状态,然后再调用write()
#5 回 angelus 的帖子 [介农酥 05-13 11:45]
angelus:基本都是这样中转服务器模式,大差不差,不过服务器一般用多线程处理,使用 void QTcpServer::incomingConnection(qintptr socketDescriptor) 函数,然后创建一个QHash保存键值对 方便进行索引,读写加锁。.. (2019-05-13 09:08)
谢谢,我用state不行,只要操作nextPendingConnection返回的QTcpSocket指针对象就段错误,我在想段错误,基本就是访问了非法的内存,难道我返回的QTcpSocket的是NULL。经过验证,打印的地址是QObject(0x0)。