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);
}

}

首先你的槽函数 _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添加数据测试一下

你可以先确定一下具体的是哪里出现了问题,socket到底有没有发送数据出去,是socket没有数据发送还是i客户端没有接收到数据?

VS上有WSAGetLastError()和GetLastError()函数可查看错误原因,不知道QT上是否有类似的函数,另外可以在网上找一个 成功的例子参考,并与你的对比,给个网址你参考下https://blog.csdn.net/bailang_zhizun/article/details/78327974

感觉好乱啊,Server和Client我都没理清。
说下基本原则
服务端:
accept到客户端口连接后,先向这个客户端发一个数据,然后再开始接收数据
客户端:
connect成功后,先向服务端发送一个数据,然后再开始接收数据

这样你才能在连接后两边都能立刻收到测试数据。