1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/linpure-go-bang-gui

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Online.cpp 6.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Linpure Отправлено 31.12.2021 13:55 9a3794a
#include "Online.h"
#include <QUdpSocket>
#include <QMessageBox>
#include <QNetworkInterface>
#include <QDebug>
Online::Online()
{
onlineRun = true;
udpSocket = new QUdpSocket();
port = 8888;
udpSocket->bind(port,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint);
onlineUsers = new std::vector<OnlineUser>[MaxUserNums];
}
Online::~Online()
{
onlineRun = false;
udpSocket->close();
delete udpSocket;
udpSocket = nullptr;
}
void Online::init()
{
setNextPos("",-1,-1,0);
setIsMaster(true);
myIpAddress = getIP();
sendMessage(NewParticipant);
}
QUdpSocket * Online::getSocket()
{
return udpSocket;
}
bool Online::getOnlineState()
{
return onlineRun;
}
//set and get am i master
void Online::setIsMaster(bool value)
{
isMaster = value;
}
bool Online::getIsMaster()
{
return isMaster;
}
//get my ip
QString Online::getMyIP()
{
return myIpAddress;
}
//get rival ip
QString Online::getRivalIP()
{
return rivalIpAddress;
}
//set rival ip
void Online::setRivalIP(QString ip)
{
rivalIpAddress = ip;
}
//set User State
void Online::setUserState(QString ip,bool val)
{
for (int i = 0; i < int(onlineUsers->size()); i++)
{
if (onlineUsers->at(i).ipAddress == ip)
{
onlineUsers->at(i).isFree = val;
}
}
}
//get User State
bool Online::getUserState(QString ip)
{
for (int i = 0; i < int(onlineUsers->size()); i++)
{
if (onlineUsers->at(i).ipAddress == ip)
{
return onlineUsers->at(i).isFree;
}
}
return false;
}
//get Next Pos
NextPos Online::getNextPos()
{
return nextPos;
}
//set Next Pos
void Online::setNextPos(QString ip,int i,int j,int color)
{
nextPos = {ip,i,j,color};
}
//add Online User
void Online::addOnlineUser(QString ipAddress)
{
for (int i = 0; i < int(onlineUsers->size()); i++)
{
if (onlineUsers->at(i).ipAddress == ipAddress)
{
return;
}
}
int nums = onlineUsers->size();
onlineUsers->push_back({nums+1,ipAddress,true});
}
//get Online User
std::vector<OnlineUser> * Online::getOnlineUser()
{
return onlineUsers;
}
//delete Online User
void Online::delOnlineUser(QString ipAddress)
{
for (int i = 0; i < int(onlineUsers->size()); i++)
{
if (onlineUsers->at(i).ipAddress == ipAddress)
{
/* code */
onlineUsers->erase(onlineUsers->begin()+i);
i--;
}
}
}
//clean Online User
void Online::cleanOnlineUser()
{
if(!onlineUsers->empty())
{
onlineUsers->clear();
}
}
// send UDP msg
void Online::sendMessage(MessageType type,ChessMsg CMsg)
{
QByteArray data;
QDataStream out(&data, QIODevice::WriteOnly);
out << type;
switch(type)
{
case ChessPos :
qDebug() << "out ChessPos:";
out << CMsg.ip1;
out << CMsg.c << CMsg.r << CMsg.color;
break;
case NewParticipant :
qDebug() << "out NewParticipant:";
out << getMyIP();
break;
case ParticipantLeft :
qDebug() << "out ParticipantLeft:";
out << getMyIP();
break;
case Refresh:
qDebug() << "out Refresh:";
out << getMyIP();
break;
case Invite :
qDebug() << "out Invite:";
out << getMyIP() << getRivalIP();
out << CMsg.color;
break;
case Accept:
break;
case Refuse :
break;
case Surrender:
qDebug() << "out Surrender:";
out << getMyIP();
break;
case Repentance :
qDebug() << "out Repentance :";
out << getMyIP();
break;
case Exception :
qDebug() << "out Exception :";
out << getMyIP();
break;
}
qDebug() << "send data size:" << data.length();
int size = udpSocket->writeDatagram(data,data.length(),QHostAddress::Broadcast, port);
qDebug() << "success data size:" << size;
}
// recieve UDP msg
ChessMsg Online::processMsg()
{
QByteArray datagram;
while(udpSocket->hasPendingDatagrams())
{
datagram.resize(int(udpSocket->pendingDatagramSize()));
udpSocket->readDatagram(datagram.data(), datagram.size());
QDataStream in(&datagram, QIODevice::ReadOnly);
qDebug() << "recieve data size:" << datagram.size();
int messageType;
in >> messageType;
QString ipAddress;
QString myIP;
QString rivalIP;
int i,j,color;
switch(messageType)
{
case ChessPos:
in >> ipAddress >> i>>j>>color;
qDebug() << "in ChessPos:";
qDebug() << ipAddress;
qDebug() << i<<j<<color;
setNextPos(ipAddress,i,j,color);
return {0,ipAddress,"",i,j,color};
break;
case NewParticipant:
in >>ipAddress;
qDebug() << "in NewParticipant:";
addOnlineUser(ipAddress);
sendMessage(Refresh);
return {1,ipAddress,"",-1,-1,0};
break;
case ParticipantLeft:
in >> ipAddress;
qDebug() << "in ParticipantLeft:";
delOnlineUser(ipAddress);
return {2,ipAddress,"",-1,-1,0};
break;
case Refresh:
in >> ipAddress;
addOnlineUser(ipAddress);
break;
case Invite:
in >> myIP >> rivalIP >> color;
qDebug() << "in Invite:";
return {4,myIP,rivalIP,-1,-1,color};
break;
case Accept:
return {5,ipAddress,"",-1,-1,0};
break;
case Refuse:
in >> ipAddress;
qDebug() << ipAddress;
return {6,ipAddress,"",-1,-1,0};
break;
case Surrender:
in >> ipAddress;
qDebug() << ipAddress;
return {7,ipAddress,"",-1,-1,0};
break;
case Repentance :
in >> ipAddress;
qDebug() << ipAddress;
return {8,ipAddress,"",-1,-1,0};
break;
case Exception :
in >> ipAddress;
qDebug() << ipAddress;
return {9,ipAddress,"",-1,-1,0};
break;
}
}
return {-1,"","",-1,-1,0};
}
// get ip
QString Online::getIP()
{
QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list) {
if(address.protocol() == QAbstractSocket::IPv4Protocol)
return address.toString();
}
return 0;
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/linpure-go-bang-gui.git
git@api.gitlife.ru:oschina-mirror/linpure-go-bang-gui.git
oschina-mirror
linpure-go-bang-gui
linpure-go-bang-gui
master