C语言服务器端与QTcpSocket客户端通信:解决Segmentation Fault问题
在服务器端代码中,出现Segmentation Fault错误的原因是在处理客户端请求时,没有正确地接收和发送数据。
首先,需要修正接收userid的代码。在服务器端的handleClientRequest函数中,接收userid的代码应该改为:
ssize_t recvSize = recv(context->sockfd, &userid, sizeof(int), 0);
if (recvSize <= 0) {
perror("userid接受失败\nrecv");
return;
}
userid = ntohl(userid); // 将网络字节序转换为主机字节序
printf("客户端已连接\n");
printf("userid:%d\n",userid);
其次,需要修正发送建议的代码。在服务器端的handleClientRequest函数中,发送建议的代码应该改为:
ssize_t sendSize = send(context->sockfd, suggestion, strlen(suggestion) + 1, 0);
if (sendSize == -1) {
perror("发送失败\nsend");
return;
}
最后,需要修正客户端的readyRead函数。在客户端的readyRead函数中,解析服务器返回的数据的代码应该改为:
QDataStream in(m_socket);
QString suggestion;
in >> suggestion; // 使用重载的 >> 运算符来读取数据
if (in.status() != QDataStream::Ok) {
ui->message->append("解析服务器返回的数据失败");
return;
}
ui->message->append(suggestion);
m_socket->close();
同时,需要在客户端的connected函数中发送userid:
void Procession::connected()
{
ui->message->append("连接成功");
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out << static_cast<quint32>(this->userid);
if (m_socket->write(block) == -1) {
ui->message->append("发送userid失败");
m_socket->close();
}
}
以上修改后,重新编译和运行代码,应该能够解决Segmentation Fault错误,并正确地接收和发送数据。
原文地址: https://www.cveoy.top/t/topic/fCwZ 著作权归作者所有。请勿转载和采集!