-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathudpserver.cpp
More file actions
executable file
·67 lines (61 loc) · 1.84 KB
/
udpserver.cpp
File metadata and controls
executable file
·67 lines (61 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "udpserver.h"
#include<QHostAddress>
UdpServer::UdpServer(MainWindow*mainWins,unsigned int port, QMap<unsigned int, ChatWindow *> *chatWins,QObject *parent) :
QObject(parent),
port(port),
chatWindows(chatWins)
{
this->mainWins=mainWins;
socket=new QUdpSocket();
socket->bind(port);
connect(socket,SIGNAL(readyRead()),this,SLOT(dataReceive()));
}
void UdpServer::showMsgReceive(unsigned int from,const QString&msg){
auto&chatWins=*chatWindows;
if(chatWins.find(from)==chatWins.end()){
chatWins[from]=new ChatWindow(mainWins,port,from,this);
}
ChatWindow*win=chatWins[from];
win->show();
win->showMsg(QString::number(from)+":\n"+msg+"\n");
}
void UdpServer::analyzeMessage(const QString&text){
if(text.isEmpty()){
return;
}
if(text[0]=='*'){//*10001*msg : id=10001发送msg给自身
QString id;
int idx=1;
while(idx<text.length()&&text[idx].isDigit()){
id+=text[idx];
++idx;
}
QString msg;
++idx;
while(idx<text.length()){
msg+=text[idx];
++idx;
}
unsigned int uIntId;
bool check;
uIntId=id.toUInt(&check);
if(check){
showMsgReceive(uIntId,msg);
}
}
}
void UdpServer::dataReceive(){
while(socket->hasPendingDatagrams()){
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
socket->readDatagram(datagram.data(),datagram.size());
QString msg=QString::fromLocal8Bit(datagram.data());
qDebug()<<datagram<<"\n"<<msg.toLocal8Bit()<<"\n"<<msg<<endl;
analyzeMessage(msg);
}
}
void UdpServer::sendMessage(unsigned int sendPort,const QString &msg){
if(!msg.isEmpty()){
socket->writeDatagram(msg.toLocal8Bit(),QHostAddress::Broadcast,sendPort);
}
}