QT 调用windows socket
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R 多变量数据预处理_R语言常用统计方法
- 下一篇: 业财一体化系统建设思路