日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

QT 调用windows socket

發布時間:2023/12/20 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT 调用windows socket 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
pro添加 LIBS += -lws2_32#ifndef WINSOCKET_H #define WINSOCKET_H#include <WinSock2.h> #include <QThread>class WinSocket : public QThread {Q_OBJECT public:explicit WinSocket();~WinSocket();void init(QString localIp,int localPort);void sendData(char data[],int length,QString remoteIp,int remotePort); private:SOCKET msocket;sockaddr_in localAddr;sockaddr_in recvAddr;sockaddr_in remoteAddr;bool initSuccess;char vrecvData[500];char vsendData[500];void run(); signals:void sendRecvData(char *data,int length,QString recvIp); public slots:void dealRecvData(char *data,int length,QString recvIp); };#endif // WINSOCKET_H#include "winsocket.h" #include <QMessageBox> #include <QDebug> WinSocket::WinSocket() {initSuccess=false; }WinSocket::~WinSocket() {if(initSuccess){::closesocket(msocket);::WSACleanup();requestInterruption();//要求中斷wait();//等待線程釋放} }void WinSocket::init(QString localIp,int localPort) {int retValue;//初始化網絡環境WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 2);retValue=::WSAStartup(sockVersion, &wsaData);if(retValue!=0){QMessageBox::information(NULL,"錯誤提示","Socket環境初始化失敗");return;}//創建socketmsocket = ::socket(AF_INET, SOCK_DGRAM, 0);if (msocket == INVALID_SOCKET){QMessageBox::information(NULL,"錯誤提示","創建socket出錯");::WSACleanup();return;}localAddr.sin_family = AF_INET;localAddr.sin_addr.s_addr = inet_addr(localIp.toLatin1());localAddr.sin_port = ::htons(localPort);//綁定函數retValue= ::bind(msocket, (struct sockaddr*)&localAddr, sizeof(sockaddr_in));if(retValue==-1){QMessageBox::information(NULL,"錯誤提示","綁定IP和端口出錯");::closesocket(msocket);::WSACleanup();return;}//信號槽連接函數connect(this,SIGNAL(sendRecvData(char *,int,QString)),this,SLOT(dealRecvData(char *,int,QString)));//設置阻塞函數int imode =0;ioctlsocket(msocket,FIONBIO,(u_long FAR*)&imode);if(retValue==SOCKET_ERROR){QMessageBox::information(NULL,"錯誤提示","阻塞函數設置失敗");::closesocket(msocket);::WSACleanup();return;}//線程調用start();initSuccess=true; }void WinSocket::run() {int length=0;int sockAddrSize=sizeof(sockaddr_in);while(false==this->isInterruptionRequested()){memset(vrecvData,0,500);length=0;length=::recvfrom(msocket, (char*)vrecvData,sizeof(vrecvData), 0, (struct sockaddr*)&recvAddr, &sockAddrSize);if(length!=-1){memcpy(vsendData,vrecvData,length);emit sendRecvData(vsendData,length,::inet_ntoa(recvAddr.sin_addr));}} }void WinSocket::dealRecvData(char data[],int length,QString recvIp) {qDebug()<<data<<" "<<length<<" "<<recvIp; }void WinSocket::sendData(char data[],int length,QString remoteIp,int remotePort) {if(initSuccess){remoteAddr.sin_family = AF_INET;remoteAddr.sin_addr.s_addr = ::inet_addr(remoteIp.toLatin1());remoteAddr.sin_port = ::htons(remotePort);::sendto(msocket, data,length,0, (sockaddr*)&remoteAddr,sizeof(sockaddr_in));} }

總結

以上是生活随笔為你收集整理的QT 调用windows socket的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。