欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

C++項(xiàng)目推薦,QT項(xiàng)目推薦-仿微信聊天,QT客戶端+Linux C++后端

1 項(xiàng)目簡介

采用QT6制作客戶端,Linux C++實(shí)現(xiàn)后端。為用戶提供了一個(gè)即時(shí)聊天平臺(tái)。

項(xiàng)目地址:https://gitee.com/voice-of-sentiment/chat-forge.git

視頻講解:C++項(xiàng)目推薦,QT項(xiàng)目推薦-仿微信聊天,QT客戶端+Linux C++后端

2 Linux C++后端編譯和運(yùn)行

git clone    https://gitee.com/voice-of-sentiment/chat-forge.git
cd chat-forge/server/thirdparty
git clone https://gitee.com/NEU-lab/SQLiteCpp.git
#回到chat-forge/server目錄
cd ..
cd build
rm -rf *
#重新cmake 編譯debug方式
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j4

編譯成功后產(chǎn)生server執(zhí)行文件。

運(yùn)行:

./server

默認(rèn)監(jiān)聽端口為:8888

3 QT客戶端編譯和運(yùn)行

編譯環(huán)境:QT6.5 MinGW 64-bit

運(yùn)行代碼前修改服務(wù)器地址的ip和端口。

注冊(cè)賬號(hào)要用數(shù)字:

4 Linux后端框架快速分析

在以下函數(shù)斷點(diǎn):

  • main
  • accept
  • recv
  • send

main函數(shù)位置

main函數(shù)入口位置

(gdb) b main
Note: breakpoint 1 also set at pc 0x5555555782a2.
Breakpoint 4 at 0x5555555782a2: file /home/lqf/linux/reactor/chat-forge/server/main.cpp, line 13.

accept監(jiān)聽位置

#0  __libc_accept (fd=4, addr=..., len=0x7fffffffde78) at ../sysdeps/unix/sysv/linux/accept.c:24
#1  0x00005555555784f1 in main (argc=1, argv=0x7fffffffdfe8) at /home/lqf/linux/reactor/chat-forge/server/main.cpp:88

recv調(diào)用位置

#0  __libc_recv (fd=6, buf=0x7ffff71a0be4, len=4, flags=0) at ../sysdeps/unix/sysv/linux/recv.c:24
#1   in Session::recvMsg[abi:cxx11]() (this=) at /home/lqf/linux/reactor/chat-forge/server/session.cpp:301
#2   in taskThread (clientFd=6) at /home/lqf/linux/reactor/chat-forge/server/chatTask.cpp:13
#3   in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55555570cd80:  <taskThread(int)>) at /usr/include/c++/10/bits/invoke.h:60
#4   in std::__invoke<void (*)(int), int> (__fn=@0x55555570cd80: 0x55555557455f <taskThread(int)>) at /usr/include/c++/10/bits/invoke.h:95
#5   in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=) at /usr/include/c++/10/thread:264
#6   in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=) at /usr/include/c++/10/thread:271
#7   in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=) at /usr/include/c++/10/thread:215
#8   in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9   in start_thread (arg=<optimized out>) at pthread_create.c:477
#10  in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

核心:

taskThread

-> Session::recvMsg 后續(xù)重點(diǎn)看Session類。

Session::handleMsg核心函數(shù)

通過分析recvMsg 找到調(diào)用 Session::handleMsg,從名字上看他就是用來處理消息的。

```

int Session::handleMsg(json msg)
{
    usleep(1000);
    int cmd = msg.at("cmd");
    //LOGINFO("handleMsg command:%s\n", cmd.c_str());
    switch (cmd)
    {
         case cmd_regist:  //注冊(cè)消息
            {
                ...
            break;
            }   
        
        case cmd_login: //登錄消息
        {
            ...
           break;
        }
        case cmd_friend_search: //好友查找消息
        {
            ...
            break;
        }
        case cmd_add_friend_request:    //添加好友請(qǐng)求
        {
            ...
        }
        break;
        case cmd_add_friend_response:  //添加好友響應(yīng)
        {
           ...
            
            break;
        }
        break;
        case cmd_friend_list:       //好友列表
        {
            ...
            break;
        }
        case cmd_friend_chat:       //好友聊天
        {...
            break;
        }
        
        case cmd_group_create:  //群創(chuàng)建
        {
          ...
            break;
        }
        
        case cmd_group_search:  //群搜索
        {
           ...
            break;
        }
        
        case cmd_group_join_request:    //加入群
        {
           ...
            break;
        }
        case cmd_group_join_response:   //加群響應(yīng)
        {
           ...
            break;
        }
        
        case cmd_group_list:        //群列表
        {
            int account = msg.at("account");
            CommandHandler::GroupList(account, this);
            break;
        }
        
        case cmd_group_chat:        //群聊天
        {
          ...
            break;
        }
        case cmd_group_member_list:     //群成員
        {
            ...
            break;
        }
        
        case cmd_group_member_add:  //群增加成員
        {
            ...
            break;
        }
        case cmd_group_member_del:      //群刪除成員
        {
          ...
            break;
        }
        case cmd_set_icon:  //設(shè)置頭像
        {
           ...
            break;
        }
        
    }
    return 0;
}

send函數(shù)位置

send函數(shù)調(diào)用,在處理完消息后應(yīng)答客戶端時(shí)調(diào)用

#0  __libc_send (fd=6, buf=0x7fffe8001180, len=78, flags=0) at ../sysdeps/unix/sysv/linux/send.c:24
#1  0x000055555557c66a in Session::sendMsg (this=, j=...) at /home/lqf/linux/reactor/chat-forge/server/session.cpp:244
#2  0x0000555555562e49 in CommandHandler::Login (account=110, password="1234", session=) at /home/lqf/linux/reactor/chat-forge/server/CommandHandler.cpp:65
#3  0x000055555557b088 in Session::handleMsg (this=, msg=...) at /home/lqf/linux/reactor/chat-forge/server/session.cpp:58
#4  0x000055555557ccb9 in Session::recvMsg[abi:cxx11]() (this=) at /home/lqf/linux/reactor/chat-forge/server/session.cpp:334
#5  0x00005555555745d6 in taskThread (clientFd=6) at /home/lqf/linux/reactor/chat-forge/server/chatTask.cpp:13

消息協(xié)議設(shè)計(jì)

消息格式:

  • [0, 3] 前4個(gè)字節(jié)封裝了后續(xù)json字符串的長度length
  • [4, length+4-1].

命令類型

// 命令枚舉
enum commands
{
    cmd_regist = 0,
    cmd_login,
    cmd_logout,
    cmd_friend_search,
    cmd_add_friend_request,
    cmd_add_friend_response,
    cmd_friend_list,
    cmd_friend_chat,

    cmd_group_create,
    cmd_group_search,
    cmd_group_join_request,
    cmd_group_join_response,
    cmd_group_list,
    cmd_group_chat,
    cmd_group_member_list,
    cmd_group_member_add,
    cmd_group_member_del,
    cmd_set_icon
};

消息是通過json做序列化:

通過觀察: rsvmsg = 分析服務(wù)器接收數(shù)據(jù)的信息,比如:

  • {"account":"120","cmd":1,"password":"1234"} ,對(duì)應(yīng)為cmd_login,登錄請(qǐng)求
    • {"account":120,"cmd":6},對(duì)應(yīng)為cmd_friend_list,請(qǐng)求獲取好友列表

    通過觀察 send: 分析服務(wù)器發(fā)送數(shù)據(jù)的信息,比如:

  • {"cmd":1,"info":["lys","hello",":/Icons/src/QQIcon/icon.jpg"],"res":"yes"} ,對(duì)應(yīng)cmd_login的響應(yīng)
  • {"cmd":6,"count":1,"msglist":[{"account":110,"icon":":/Icons/src/QQIcon/icon.jpg","name":"lqf","online":1,"sig":"hello"}]},對(duì)應(yīng)cmd_friend_list請(qǐng)求獲取好友列表的響應(yīng),好友在msglist里。

核心類Session

每個(gè)客戶端綁定一個(gè)session,綁定了socket fd.

#c++##校招過來人的經(jīng)驗(yàn)分享##校招##簡歷中的項(xiàng)目經(jīng)歷要怎么寫##我的成功項(xiàng)目解析#
全部評(píng)論

相關(guān)推薦

因?yàn)橛械念}答的過于離譜我忍不住大笑起來1.&nbsp;自我介紹2.&nbsp;面試官:客戶端能接受嗎,了解客戶端嗎,base地接受嗎,我反問安卓客戶端用什么,面試官說java&nbsp;kotlin都有3.&nbsp;挑一個(gè)項(xiàng)目介紹(光速吟唱黑馬點(diǎn)評(píng))4.&nbsp;項(xiàng)目中有用到線程池的部分嗎?5.&nbsp;線程之間的通信方式?(答了synchronized,reentrant&nbsp;lock,notify)有什么保證原子性和可見性的嗎?(補(bǔ)充了atomicinteger,volatile)6.&nbsp;線程池是怎么實(shí)現(xiàn)的?7.&nbsp;項(xiàng)目中有什么內(nèi)存泄露的地方嗎?8.&nbsp;還有別的項(xiàng)目用到并發(fā)編程嗎?9.&nbsp;redis為什么快(相比sql等)?redis是單線程嗎?redis有哪些特性可以實(shí)現(xiàn)并發(fā)安全?redis是單線程為什么并發(fā)性能不差?為什么沒用其他的數(shù)據(jù)庫?比如sql10.&nbsp;java面向?qū)ο笥惺裁刺攸c(diǎn)?11.&nbsp;overload&nbsp;override區(qū)別,overload返回類型/返回值能不一樣嗎?12.&nbsp;內(nèi)部類(聞所未聞)13.&nbsp;jvm區(qū)域有哪些?14.&nbsp;怎么判斷一個(gè)對(duì)象能被垃圾回收?15.&nbsp;tcp&nbsp;udp比較,怎么解決udp的丟包問題?我說了個(gè)quic,把面試官整笑了16.&nbsp;lc&nbsp;143&nbsp;重排鏈表17.&nbsp;反問1:具體崗位內(nèi)容18.&nbsp;反問2:客戶端還需要學(xué)什么技術(shù)
查看18道真題和解析
點(diǎn)贊 評(píng)論 收藏
分享
評(píng)論
4
9
分享

創(chuàng)作者周榜

更多
??途W(wǎng)
??推髽I(yè)服務(wù)