SilenceNote 2019-08-30 15:56 采纳率: 50%
浏览 873
已采纳

QT平台Socket编程问题

我在QT开启了一个socket服务器端,逻辑是与客户端建立连接后就开启定时器不停的接受和发送数据,但是我用TCP工具创建了一个客户端测试的时候,发现连接可以建立,客户端却没有收到服务器发送的数据,求大家帮我看看是代码哪里逻辑有问题吗,第一次搞socket编程
下面先放个我的开启服务器的函数,这个函数会与客户端建立lian'jie
SOCKET CComm::StartServer()
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}

//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
 printf("socket e"
        "rror !");
 return 0;
}

//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8765);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.0.107");
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
 printf("bind error !");
}

//开始监听
if (listen(slisten, 5) == SOCKET_ERROR)
{
 printf("listen error !");
 return 0;
}

//循环接收数据
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);

while (true)
{
 printf("等待连接...\n");
 sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
 if (sClient == INVALID_SOCKET)
 {
  printf("accept error !");
  continue;
 }
 printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
 break;
}

int SendTimeout = 1000;   //1000ms
int RecvTimeout = 1000;   //1000ms
setsockopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&RecvTimeout, sizeof(int));
setsockopt(sClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&SendTimeout, sizeof(int));
connectState = true;

return sClient;

}

然后就是运行QT程序
开启服务器成功后,再开启定时器定时接收
/***********建立本地服务器*******/
void Dialog::on_Btn_StartServer_clicked()
{
SOCKET testsClient = test.StartServer();

if(connectState == true && flag == 0)
 {
     //和上位机通讯的定时器//
    _TCPServerTimeout = new QTimer(this);
    _TCPServerTimeout->start(90);
    connect(_TCPServerTimeout, SIGNAL(timeout()), this, SLOT(_onTCPServerTimeout()));
     flag = 1;
 }

}

void Dialog::_onTCPServerTimeout()
{
int ret;
const char * sendData = "测试,接收到TCP客户端消息!\n";
char revData[255];

while (true)
{
//接收数据
ret = recv(testsClient, revData, 255, 0);
if (ret > 0)
{
 revData[ret] = 0x00;
}

send(testsClient, sendData, strlen(sendData), 0);
}

}

  • 写回答

4条回答

  • qtchen_1988 2019-08-30 16:32
    关注

    首先你的槽函数 _onTCPServerTimeout() 是定时器触发的;
    执行这个函数的时候先运行了 ret = recv(testsClient, revData, 255, 0);这个;
    如果客户端没数据过来,服务器会一直阻塞在这里,不会往下走,因此不会执行
    send(testsClient, sendData, strlen(sendData), 0); 也就不会给客户端发送消息;

    解决方法:
    你把

    ret = recv(testsClient, revData, 255, 0);
    if (ret > 0)
    {
     revData[ret] = 0x00;
    }
    
    

    注释掉,自己手动对revData添加数据测试一下

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况