Windows平台下實現Qt的UDP通訊
今天我們用Qt實現UDP通訊,模擬器發送訊息到主機,主機顯示出來。很簡單。
1.
我們先完成主機的部分,用VS2005完成,下面的代碼不多解釋了:
#include <stdio.h>#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define SERVER_PORT 45454int main(){ /* init winsock */ WSADATA wsaData; if(WSAStartup(MAKEWORD(2,1), &wsaData)) { printf("winsock init failed!\n"); return 1; } struct sockaddr_in local; struct sockaddr_in from; int len = sizeof(struct sockaddr_in); local.sin_family = AF_INET; local.sin_port = htons(SERVER_PORT); /* 監聽連接埠 */ local.sin_addr.s_addr = INADDR_ANY; /* 本機 */ /* create udp socket */ SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0); bind(sock_fd, (struct sockaddr *)&local, sizeof(local)); char buffer[1024]; int size; while(1) { buffer[0] = '\0'; printf("waiting...\n"); size = recvfrom(sock_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&from, &len); if(size != SOCKET_ERROR) { buffer[size] = '\0'; printf("From %s: \n%s\n", inet_ntoa(from.sin_addr), buffer); } } closesocket(sock_fd); WSACleanup(); return 0;}
2.
然後完成Qt部分。建立一個“Qt Gui 應用”:
輸入“udpsender”:
三個平台都選擇:
選擇QWidget:
建立完成!
3.
修改widget.ui,添加一個Text Edit,id為textSend;添加一個PushButton,id為btnSend:
4.
修改widget.h如下,主要是加入了QUdpSocket:
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QtNetwork/QUdpSocket>namespace Ui { class Widget;}const QString SERVER_ADDR = "127.0.0.1";const int SERVER_PORT = 45454;class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui; QUdpSocket *udpSocket;private slots: void sendText();};#endif // WIDGET_H
說明:上面的SERVER_ADDR是原生ip地址,你可以替換成區域網路裡的另一台主機的ip地址。另外SERVER_PORT需要和第一步Windows主機的連接埠相同。
5.
修改widget.cpp如下:
#include "widget.h"#include "ui_widget.h"#include <QByteArray>Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); udpSocket = new QUdpSocket(this); QObject::connect(ui->btnSend, SIGNAL(clicked()), this, SLOT(sendText()));}Widget::~Widget(){ delete ui;}void Widget::sendText(){ QByteArray datagram = ui->textSend->toPlainText().toAscii(); udpSocket->writeDatagram(datagram, datagram.size(), QHostAddress(SERVER_ADDR), SERVER_PORT);}
6.
最後修改udpsender.pro如下:
#-------------------------------------------------## Project created by QtCreator 2012-06-07T12:54:34##-------------------------------------------------QT += core guiTARGET = udpsenderTEMPLATE = appSOURCES += main.cpp\ widget.cppHEADERS += widget.hFORMS += widget.uiQT += networkCONFIG += mobilityMOBILITY = symbian { TARGET.UID3 = 0xe7254336 # TARGET.CAPABILITY += TARGET.EPOCSTACKSIZE = 0x14000 TARGET.EPOCHEAPSIZE = 0x020000 0x800000}
注意,Qt += network這句非常重要!另外,TARGET.UID3可以不用修改
7.
最後選擇目標為“Qt 模擬器”,運行結果如下:
8.
移植到手機中運行:由於我的Nokia 5230不支援wifi,所以我得換另一個手機,這裡先空著:
最後我把代碼也上傳上來了:
完成!