这是因为文件路径不对造成的,解决方法如下:
1、首先pro文件配置:Qt网络功能需要在pro文件增加网络库。
2、QTcpServer服务端建立的方法代码,如下图所示。
3、QTcpServer当有新客户端连接时,会发出QTcpServer::newConnection的信号方法代码。
4、客户端为主动连接方不需要监听,直接建立QTcpSocket代码。
5、最后通过connectToHost连接指定ip和端口,将socket的连接成功的信号与对应槽连接,当连接成功可以将自定义的标记位置为true。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested
WSADATA wsaData
int ret, nLeft, length
SOCKET sListen, sServer//侦听套接字,连接套接字
struct sockaddr_in saServer, saClient//地址信息
char *ptr//用于遍历信息的指针
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2)//希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData)
if(ret!=0)
{
printf("WSAStartup() failed!\n")
return
}
//创建Socket,使用TCP协议
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
if (sListen == INVALID_SOCKET)
{
WSACleanup()
printf("socket() faild!\n")
return
}
//构建本地地址信息
saServer.sin_family = AF_INET//地址家族
saServer.sin_port = htons(SERVER_PORT)//注意转化为网络字节序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY)//使用INADDR_ANY 指示任意地址
//绑定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer))
if (ret == SOCKET_ERROR)
{
printf("bind() faild! code:%d\n", WSAGetLastError())
closesocket(sListen)//关闭套接字
WSACleanup()
return
}
//侦听连接请求
ret = listen(sListen, 5)
if (ret == SOCKET_ERROR)
{
printf("listen() faild! code:%d\n", WSAGetLastError())
closesocket(sListen)//关闭套接字
return
}
printf("Waiting for client connecting!\n")
printf("Tips: Ctrl+c to quit!\n")
//阻塞等待接受客户端连接
while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{
length = sizeof(saClient)
sServer = accept(sListen, (struct sockaddr *)&saClient, &length)
if (sServer == INVALID_SOCKET)
{
printf("accept() faild! code:%d\n", WSAGetLastError())
closesocket(sListen)//关闭套接字
WSACleanup()
return
}
char receiveMessage[5000]
nLeft = sizeof(receiveMessage)
ptr = (char *)&receiveMessage
while(nLeft>0)
{
//接收数据
ret = recv(sServer, ptr, 5000, 0)
if (ret == SOCKET_ERROR)
{
printf("recv() failed!\n")
return
}
if (ret == 0) //客户端已经关闭连接
{
printf("Client has closed the connection\n")
break
}
nLeft -= ret
ptr += ret
}
printf("receive message:%s\n", receiveMessage)//打印我们接收到的消息。
}
// closesocket(sListen)
// closesocket(sServer)
// WSACleanup()
}
【客户端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
socket可以发送任意类型的数据。socket本身不限制你要发送什么,而是由你自己来定要发什么的。只要你接收端能识别发来的是什么即可。协议的三个基本要素,语法、语义、同步。比如你用于表示文件属性的结构体或者其他什么数据长度固定是20字节,那么你就在发送文件内容之前把这20字节发送过去,接收端在接收内容之前,固定会先接收20字节并作为文件属性,随后接收到的内容才作为数据存入文件,这样就可以做到了。
关键点就在于自己要定好语法、语义、同步这些,发送端和接收端配合好动作。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)