QT中使用winsock创建Tcp连接传文件

2023-11-06

#第一步链接库

qmake:LIBS += -lws2_32
cmake:target_link_libraries( send(send是项目名称替换自己的) PUBLIC $<$<BOOL:${MINGW}>:ws2_32>)(实测有效)(注意是MINGW平台)

在还有就是在文件开头加入

#pragma comment(lib, "ws2_32.lib")

也行

#加入头文件
 include <WinSock2.h>

#编写代码
调用WSAStartup,初始化套接字
发送

//定义变量
SOCKET msocket;
sockaddr_in server_addr;
    

WORD sockVerson = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVerson, &wsaData))
{
    qDebug() << "初始化WinSock失败";
}

msocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (msocket == INVALID_SOCKET)
{
        qDebug() << "套接字创建失败";
        WSACleanup();
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port.toUShort()); // 服务器侦听的端口号
server_addr.sin_addr.S_un.S_addr = inet_addr(server_ip.toStdString().c_str()); // 服务器IP地址

int result = ::connect(msocket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (result == SOCKET_ERROR) {
    qDebug() << "connect请求连接失败" << WSAGetLastError();
    closesocket(msocket);
    WSACleanup();
    }
else{
     qDebug() << "向服务器请求连接成功";
    }

//然后开始send
::send(msocket,filehead.data(),filehead.size(),0);

接收

    //定义变量
    SOCKET msocket;
    sockaddr_in serverAddr;
    sockaddr_in clientAddr;
    sockaddr_in remoteAddr;



    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) !=0 )
    {
        qDebug() << "Failed to initiate Winsock.";
    }
    msocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (msocket == INVALID_SOCKET)
    {
        qDebug() << "Failed to create socket.";
    }

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(port.toUShort()); // 服务器侦听的端口号
    serverAddr.sin_addr.S_un.S_addr = inet_addr(ip.toStdString().c_str()); // 服务器IP地址

    if (bind(msocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)  //(SOCKADDR*)
    {
        qDebug() << "socket绑定失败";
        closesocket(msocket);
    }
    //3.监听套接字
    listen(msocket, 5);
    //4.等待客户端的连接
    int clientAddrsize = sizeof(clientAddr);
    qDebug() <<  "等待客户端登录";
    int revSocket = accept(msocket, (SOCKADDR*)&clientAddr, &clientAddrsize);//等待客户端接入,直到有客户端连接上来为止
    if (revSocket == INVALID_SOCKET)
    {
        qDebug() << "服务器循环接收请求失败:\n" << WSAGetLastError();
        closesocket(msocket);
        WSACleanup();
    }
    else
    {
        qDebug() << "客服端与服务器建立连接成功:%s \n";
    }

    //int nRecvBuf=1024*8*10000;
    //int nTimeout = 1000;
    //setsockopt(msocket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
    //setsockopt(msocket,SOL_SOCKET,SO_RCVTIMEO,(const char *)&nTimeout, sizeof(int));
    //5.收
    while(!stop1)
    {
        arry.resize(8192);
        int i = recv(revSocket, arry.data(), 8192, 0);
    }

注意读取的时候,一定是recv,accept返回的句柄,在这个句柄里才能读到发送的数据,尼玛读半天读不到数据,一直是-1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中使用winsock创建Tcp连接传文件 的相关文章

  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 是否有 Qt 小部件可以浏览应用程序中小部件的层次结构(类似于 Spy++)?

    我们有一个具有复杂的小部件层次结构的应用程序 我希望能够以与 Spy 类似的方式浏览此层次结构 查看和编辑属性 例如大小 如果有一个小部件可以显示此信息 则它不需要在外部应用程序中运行 那么问题来了 这样的神兽存在吗 您可以使用Gammar
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • Qt:将数字转换为 QString、QVariant 或 QString::number 哪个更好

    我只是好奇 比方说 我需要在控制台中输出一个数字 代码是 include
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren

随机推荐