亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qchatserver.cpp

?? 用qt4 編寫的局域網聊天工具
?? CPP
字號:
/*************************************************************************** *   Copyright (C) 2007 by Anistratov Oleg                                 * *   ower86@gmail.com                                                      * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License version 2        * *   as published by the Free Software Foundation;                         * *                                                                         * *   This program is distributed in the hope that it will be useful,       * *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * *   GNU General Public License for more details.                          * *                                                                         * ***************************************************************************/#include "qchatserver.h"#include "globals.h"#include "assert.h"#include "message.h"#include "msghistory.h"QChatServer::QChatServer(QObject *parent) : QObject        (parent),  AbstractChatCore(),  m_buffer        (NULL),  m_bufferSize    (65535),  m_welcomeMessage("Welcome to qchat"),  m_nextUid(101){  m_newConnections = new QList<QChatServerSocket*>;  m_buffer         = (char*)malloc(m_bufferSize);  assert(NULL != m_buffer);  if(!m_server.listen(QHostAddress::Any, 61100))  {    qWarning("[QChatServer::QChatServer]: could not start listening of incoming connections. Maybe another server is already running.");    exit(1);  }  connect(&m_server, SIGNAL(newConnection()), this, SLOT(processNewConnections()));  printf("QChat server version 0.1.1 started\n");}QChatServer::~QChatServer(){}void QChatServer::processNewConnections(){  QChatServerSocket* s;  char* buf;  while(m_server.hasPendingConnections())  {    s = new QChatServerSocket(this, m_server.nextPendingConnection());   if(s->peerAddress() != QHostAddress("127.0.0.1") && m_bannedIPs.contains(s->peerAddress()))   {     delete s;     return;   }    connect(s, SIGNAL(disconnected()), this, SLOT(processDisconnect()));    connect(s, SIGNAL(newDtgrm())    , this, SLOT(processNewData()));    buf = (char*)malloc(MAX_PACKET_LEN);    assert(NULL != buf);    m_newConnections->append(s);  }}void QChatServer::processDisconnect(){  QChatServerSocket* s = qobject_cast<QChatServerSocket*>(sender());  User* usr;  QString login;  if(s)  {    usr = m_users[s];    if(usr)    {      login = usr->login();      foreach(QString ch, usr->channels())      {        clearParametrs();        addParametr("Channel", ch.toUtf8());        // TODO fill other users data too        prepareDatagram(AbstractChatCore::DISCONNECTED, Common, usr->login(), usr->info()->compName(), usr->uid(), "Disconnected");        foreach(QChatServerSocket* soc, m_users.keys())          sendData(soc, usr->uid());      }    }    printf("%s disconnected\n", QString("%1(%2)").arg(login).arg(s->peerAddress().toString()).toAscii().data());    qDebug("[QChatServer::processDisconnect]: %s disconnected", s->peerAddress().toString().toAscii().data());    delete m_users.take(s);  }}void QChatServer::processNewData(){  User*   user;  int     dataSize;  uint    uid;  bool    loggedIn;  QString expectedLogin;  char*   ip_port;  m_currentSocket = qobject_cast<QChatServerSocket*>(sender());  if(m_currentSocket)  {    ip_port = QString(m_currentSocket->peerAddress().toString() + ":%1").arg(m_currentSocket->peerPort()).toAscii().data();    qDebug("[QChatServer::processNewData]: New Data from %s", ip_port);    loggedIn = m_users.contains(m_currentSocket);    dataSize = m_currentSocket->readDtgrm(m_buffer, m_bufferSize);    if(dataSize < 0)    {      qWarning("[QChatServer::processNewData](%s): error while reading from socket", ip_port);      return;    }    if(dataSize < (int)protocolLen())    {      qWarning("[QChatServer::processNewData](%s): dataSize < ProtocolLen (%d < %d). Ignoring this packet\n", ip_port, dataSize, AbstractChatCore::protocolLen());      return;    }    switch(packetType(m_buffer))    {      case INSTRUCTION:        if(m_currentSocket->peerAddress() == QHostAddress::LocalHost)          processInstructions(dataSize);        return;    }    if(!loggedIn)    {//       if(qstrncmp(m_buffer, programId(), programIdLen() - (protocolVersion() < 4 ? 2 : 0)))//       {//         qWarning("[QChatServer::processNewData](%s): [ID_ERROR!]. Ignoring this packet\n", ip_port);//         return;//       }      if(packetType(m_buffer) != WANT_LOGIN)      {        qWarning("[QChatServer::processNewData](%s): Other than WANT_LOGIN packet from not logged in user. Ignoring this packet\n", ip_port);        return;      }      expectedLogin = message(m_buffer, dataSize);      setUserLogin(expectedLogin);    }    else// if(SrcIp(m_buffer) > 1)    {//       qDebug("[QChatServer::processNewData](%s): data from logged in user(uid=%d)", ip_port, srcIp(m_buffer));      QString nick = userName(m_buffer, dataSize);      uint dest_uid = destIp(m_buffer);      if(m_users[m_currentSocket])        uid  = m_users[m_currentSocket]->uid();      user = m_users[m_currentSocket];      // sending paket only if nickname in this packet corresponds to user's login      if(user->login() == nick && uid > 100)      {        setInputBuffer(m_buffer, dataSize);        fillHeader();        QString channel_name = QString().fromUtf8(getParametr("Channel", hdr()->parametrs));        switch(hdr()->type)        {          case AbstractChatCore::CONNECTED :            m_users[m_currentSocket]->addChannel(channel_name);            break;          case AbstractChatCore::DISCONNECTED :            m_users[m_currentSocket]->removeChannel(channel_name);            break;          case AbstractChatCore::MESSAGE :            addMessage(channel_name, new Message(hdr()));            break;          case AbstractChatCore::MSGS_HISTORY_REQUEST :            if(m_channelsHistory.contains(channel_name))              msgsHistoryAnswer(channel_name, hdr()->src_ip,                               m_channelsHistory[channel_name]->toByteArray(getParametr("MaxMsgsHistorySize", hdr()->parametrs).toLongLong()),                               (AbstractChatCore::ChannelType)hdr()->chnnl_id, m_currentSocket);               return;          case AbstractChatCore::MSGS_NUM_REQUEST :            if(m_channelsHistory.contains(channel_name))              msgsHistoryAnswer(channel_name, hdr()->src_ip,                               m_channelsHistory[channel_name]->toByteArray(getParametr("MaxMsgsHistorySize", hdr()->parametrs).toLongLong()),                               (AbstractChatCore::ChannelType)hdr()->chnnl_id, m_currentSocket);               return;        }        setOutputBuffer(m_buffer, dataSize);        // if destination user_id is empty it means msg is broadcast        if(dest_uid == 0)        {          foreach(QChatServerSocket* s, m_users.keys())            sendData(s, uid);        }        else if(dest_uid == 1)        {          sendData(m_currentSocket, uid);        }        else        {          foreach(QChatServerSocket* s, m_users.keys())          {            if(m_users[s]->uid() == dest_uid)            {              sendData(s, uid);              break;            }          }        }      }      else      {//         qDebug("[QChatServer::processNewData](%s): !data from logged in user(uid=%d)", ip_port, srcIp(m_buffer));        setInputBuffer(m_buffer, dataSize);        fillHeader();        if(hdr()->type == AbstractChatCore::CHANGE_LOGIN)          setUserLogin(nick);      }    }  }}QString QChatServer::checkLogin(const QString & login){  if(m_bannedLogins.contains(login))    return tr("This login is banned");  foreach(User* u, m_users.values())    if(login == u->login())      return tr("This login is already in use");  return "";}int QChatServer::sendData(QChatServerSocket* socket, uint src_uid){ /* if(largeDtgrm())  {    quint32 ID = m_sender->getValidID();    if(ID)    {      emit wantSendLargeData(header(), headerSize(), data(), dataSize(), addr, ID);      setNULLdataAndHeader();    }  }  else */  // FIXME  setPacketSize(outputBufferSize());  setSrcIp(outputBuffer(), src_uid);  int bs = socket->write(outputBuffer(), outputBufferSize());  socket->flush();  qDebug("[QChatServer::sendData]: dtgrm size = %d, sent = %d\n", outputBufferSize(), bs);  return bs;//     quint16 size = outputBufferSize() <= MAX_PACKET_LEN ? outputBufferSize() : (MAX_PACKET_LEN);  clearParametrs();}uint QChatServer::login(QChatServerSocket* socket, const QString & lgn){  User* user = new User;  user->setSocket(socket);  user->setLogin(lgn);  user->setUid(m_nextUid++);  m_users.insert(socket, user);  m_newConnections->removeAll(socket);//   strncpy(m_buffer, AbstractChatCore::programId(), programIdLen());//   setInputBuffer(m_buffer, dataSize());//   fillHeader();  user->info()->setCompName(compName(m_buffer, m_bufferSize));  return m_nextUid - 1;}void QChatServer::rejectLogin(QChatServerSocket* socket, const QString & reason){  prepareDatagram(AbstractChatCore::LOGIN_REJECTED, socket->peerAddress().toIPv4Address(), "", "", 0, reason);  sendData(socket);}void QChatServer::addMessage(const QString& channel, Message* msg){  MsgHistory* history;  if(!m_channelsHistory.contains(channel))  {    history = new MsgHistory();    m_channelsHistory.insert(channel, history);  }  else    history = m_channelsHistory[channel];  history->addMsg(msg);}void QChatServer::msgsHistoryAnswer(const QString & ch_name_id, quint64 dest_uid, const QByteArray & msgs, AbstractChatCore::ChannelType type, QChatServerSocket* soc){  addParametr("Channel"    , ch_name_id.toUtf8());  addParametr("MsgsHistory", msgs);  prepareDatagram(AbstractChatCore::MSGS_NUM_ANSWER,                  dest_uid,                  "Server",                  "Server",                  0,                  "",                  type,                  0,                  0);  sendData(soc);}void QChatServer::msgsNumAnswer(const QString & ch_name_id, quint64 dest_uid, QChatServerSocket* soc){  addParametr("Channel", ch_name_id.toUtf8());  addParametr("MsgsNum", QString().setNum(quint32(100)).toUtf8());  prepareDatagram(AbstractChatCore::MSGS_HISTORY_ANSWER,                  dest_uid,                  "Server",                  "Server",                  0,                  "",                  Common,                  0,                  0);  sendData(soc);}void QChatServer::sendInstruction(const QString & user, const QString & instruction){  prepareDatagram(INSTRUCTION,                  1,                  user,                  "Server",                  1,                  instruction,                  Common,                  0,                  0);  QChatServerSocket socket;//   qDebug("[QChatServer::sendKickUser]: connecting to %s:%d", addr.toString().toAscii().data(), port);  socket.connectToHost(QHostAddress::LocalHost, 61100);  if(socket.waitForConnected(10000))    sendData(&socket, 1);}void QChatServer::kickUser(const QString & user){  QMapIterator<QChatServerSocket*, User*> it(m_users);  printf("Kicking user %s...\n", user.toLocal8Bit().data());  while(it.hasNext())  {    it.next();    if(it.value()->login() == user)    {      // TODO send message with reason of disconnection      it.key()->disconnectFromHost();      printf("%s was kicked\n", user.toLocal8Bit().data());      return;    }  }  printf("%s was not found on this server\n", user.toLocal8Bit().data());}void QChatServer::processInstructions(int dataSize){  QString user = userName(m_buffer, dataSize);  if(destIp(m_buffer) == 1 && srcIp(m_buffer) == 1 && packetType(m_buffer) == INSTRUCTION && compName(m_buffer, dataSize) == "Server")  {    if(message(m_buffer, dataSize) == "Kick")      kickUser(user);    else if(message(m_buffer, dataSize) == "Ban")      banUser(user);    else if(message(m_buffer, dataSize) == "Unban")      unbanUser(user);    if(message(m_buffer, dataSize) == "KickIp")      kickIp(user);    else if(message(m_buffer, dataSize) == "BanIp")      banIp(user);    else if(message(m_buffer, dataSize) == "UnbanIp")      unbanIp(user);    else if(message(m_buffer, dataSize) == "UnbanAll")      m_bannedLogins.clear();    else if(message(m_buffer, dataSize) == "UnbanAllIPs")      m_bannedIPs.clear();  }}void QChatServer::banUser(const QString& user){  printf("Banning user %s...\n", user.toLocal8Bit().data());  if(!m_bannedLogins.contains(user))    m_bannedLogins.append(user);  kickUser(user);}void QChatServer::unbanUser(const QString& user){  printf("Unbanning user %s...\n", user.toLocal8Bit().data());  m_bannedLogins.removeAll(user);}void QChatServer::kickIp(const QString & ip){  QHostAddress addr;  if(addr.setAddress(ip))    foreach(QChatServerSocket* s, m_users.keys())      if(s->peerAddress() == addr)        s->disconnectFromHost();}void QChatServer::banIp(const QString & ip){  QHostAddress addr;  if(addr.setAddress(ip))  {    if(!m_bannedIPs.contains(addr))      m_bannedIPs.append(addr);    kickIp(ip);  }}void QChatServer::unbanIp(const QString & ip){  QHostAddress addr;  if(addr.setAddress(ip))     m_bannedIPs.removeAll(addr);}void QChatServer::setUserLogin(const QString & expectedLogin){  QString error = checkLogin(expectedLogin);  User* user = NULL;  int uid = 0;  if(m_users.contains(m_currentSocket))    user = m_users[m_currentSocket];  if(expectedLogin.isEmpty())  {    rejectLogin(m_currentSocket, "Expected Login is empty");    return;  }  if(error.isEmpty())  {    if(user)    {      user->setLogin(expectedLogin);      uid = user->uid();    }    else      uid = login(m_currentSocket, expectedLogin);    prepareDatagram(AbstractChatCore::LOGIN_ACCEPTED, uid, expectedLogin, "Server", uid, m_welcomeMessage);    sendData(m_currentSocket, uid);   printf("%s is logged in\n", QString("%1(%2)").arg(expectedLogin).arg(m_currentSocket->peerAddress().toString()).toAscii().data());  }  else    rejectLogin(m_currentSocket, error);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97超碰欧美中文字幕| 精品国产青草久久久久福利| 欧美精品一级二级| 久久亚洲私人国产精品va媚药| 亚洲毛片av在线| 国内久久精品视频| 欧美高清视频一二三区| 中文字幕一区不卡| 国产电影精品久久禁18| 欧美高清dvd| 亚洲国产成人porn| 99久久综合狠狠综合久久| www精品美女久久久tv| 亚洲大片在线观看| 色欧美乱欧美15图片| 久久精品视频免费| 香蕉久久一区二区不卡无毒影院 | 精品久久久久一区| 亚洲综合免费观看高清完整版| 丁香六月久久综合狠狠色| 日韩一区二区三区免费观看| 亚洲不卡在线观看| 日本韩国一区二区三区视频| 欧美国产日韩精品免费观看| 色诱视频网站一区| 一区在线播放视频| 92国产精品观看| 国产精品久久久久7777按摩| 国产成人免费av在线| 久久午夜羞羞影院免费观看| 国模娜娜一区二区三区| 欧美刺激午夜性久久久久久久| 日韩av一级片| 91精品国产一区二区三区香蕉| 亚洲成av人综合在线观看| 欧美私人免费视频| 亚洲h精品动漫在线观看| 欧美人与性动xxxx| 日韩国产欧美在线视频| 日韩欧美国产成人一区二区| 激情偷乱视频一区二区三区| www激情久久| 成人成人成人在线视频| 亚洲视频每日更新| 欧美自拍丝袜亚洲| 秋霞影院一区二区| 精品国产91久久久久久久妲己 | 国产一区二区三区免费| 精品国产乱子伦一区| 国产精品亚洲第一区在线暖暖韩国| 久久久久国产一区二区三区四区 | 亚洲第一福利一区| 91精品在线麻豆| 国产一区二区三区四区五区美女| 欧美激情综合五月色丁香| www.av精品| 天天影视网天天综合色在线播放| 日韩一区二区三区三四区视频在线观看| 蜜桃视频一区二区三区| 国产日韩欧美高清| 在线观看91视频| 日韩电影免费一区| 欧美激情综合网| 欧美日韩卡一卡二| 国产精品一区免费在线观看| 亚洲天堂福利av| 欧美一级片免费看| 成人在线综合网| 视频在线观看一区二区三区| 久久久久久综合| 欧美性色综合网| 国产自产2019最新不卡| 伊人开心综合网| 久久夜色精品国产噜噜av| 在线看不卡av| 国产精品自拍毛片| 亚洲一区二区在线观看视频| 久久久精品2019中文字幕之3| 色吧成人激情小说| 国产盗摄一区二区三区| 午夜视频在线观看一区二区| 中文字幕免费不卡在线| 日韩一区二区高清| 在线观看一区二区精品视频| 风间由美一区二区av101| 视频在线观看一区二区三区| 亚洲男同性视频| 国产欧美日韩在线看| 制服丝袜av成人在线看| 91福利视频久久久久| 成人av免费在线| 国产中文字幕精品| 欧美aaa在线| 亚洲国产日产av| 亚洲图片欧美激情| 国产精品免费看片| 欧美国产一区二区| 久久精品一区二区三区四区| 91麻豆精品国产| 欧美疯狂性受xxxxx喷水图片| 色女孩综合影院| 91麻豆国产精品久久| 99综合电影在线视频| 国产黄人亚洲片| 国模少妇一区二区三区| 麻豆国产91在线播放| 日韩高清一区在线| 午夜久久久久久久久| 亚洲成人av中文| 亚洲无线码一区二区三区| 一区二区三区波多野结衣在线观看| 国产精品美女久久久久久| 国产精品视频第一区| 欧美国产精品一区二区三区| 国产网红主播福利一区二区| 国产性色一区二区| 欧美韩国日本综合| 亚洲视频免费观看| 亚洲综合色区另类av| 亚洲一区在线看| 午夜精品国产更新| 青青草97国产精品免费观看| 老司机精品视频导航| 免费观看久久久4p| 黄色资源网久久资源365| 国产裸体歌舞团一区二区| 国产成人自拍网| 99r精品视频| 欧美中文一区二区三区| 欧美美女视频在线观看| 日韩欧美国产综合一区| 久久久蜜桃精品| 中文字幕在线观看一区| 亚洲一二三区视频在线观看| 亚洲国产日韩一区二区| 美女尤物国产一区| 国产99久久久国产精品潘金| 色综合一个色综合| 777xxx欧美| 国产亚洲精品bt天堂精选| 最新国产精品久久精品| 五月天一区二区| 国产精品亚洲专一区二区三区| av中文字幕一区| 正在播放亚洲一区| 国产精品女主播在线观看| 午夜欧美大尺度福利影院在线看 | 亚洲第一二三四区| 久久国产免费看| 91日韩精品一区| 欧美一级久久久| 成人免费一区二区三区在线观看| 亚洲第一激情av| 国产91精品入口| 8x8x8国产精品| 一区免费观看视频| 精品影视av免费| 欧美综合一区二区三区| 久久中文娱乐网| 亚洲成人在线网站| 成人国产精品视频| 欧美一级淫片007| 亚洲色图色小说| 国产原创一区二区| 欧美日韩一区小说| 国产精品成人免费精品自在线观看| 亚洲福利国产精品| 99视频一区二区| 精品国产不卡一区二区三区| 亚洲一区二区精品视频| 成人午夜在线免费| 26uuu久久综合| 日韩精品福利网| 欧美亚洲尤物久久| 成人免费一区二区三区视频 | 日韩精品一区第一页| 93久久精品日日躁夜夜躁欧美| 久久尤物电影视频在线观看| 午夜精品久久久久久久蜜桃app| www.亚洲在线| 久久久久久亚洲综合| 日韩电影一区二区三区| 欧美羞羞免费网站| 亚洲免费伊人电影| 波多野结衣亚洲一区| 久久精品视频在线免费观看| 久久国产婷婷国产香蕉| 欧美一级午夜免费电影| 天堂蜜桃91精品| 91 com成人网| 轻轻草成人在线| 欧美一区二区免费视频| 亚洲不卡在线观看| 欧美日韩三级在线| 午夜影院在线观看欧美| 欧美视频在线不卡| 亚洲一区日韩精品中文字幕| 久久日一线二线三线suv| 国内精品伊人久久久久影院对白| 日韩免费观看高清完整版|