日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为客户端加入输入线程

發(fā)布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为客户端加入输入线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 為客戶端加入輸入線程
      • 1.1 概述
      • 1.2 客戶端實現(xiàn)

1 為客戶端加入輸入線程

1.1 概述

為了能讓客戶端處理我們的輸入,我們需要為客戶端加入輸入線程。

1.2 客戶端實現(xiàn)

#define WIN32_LEAN_AND_MEAN#include<windows.h> #include<WinSock2.h> #include<stdio.h> #include<thread>#pragma comment(lib,"ws2_32.lib")enum CMD {CMD_LOGIN,CMD_LOGIN_RESULT,CMD_LOGOUT,CMD_LOGOUT_RESULT,CMD_NEW_USER_JOIN,CMD_ERROR };struct DataHeader {short dataLength;short cmd; };//DataPackage struct Login : public DataHeader {Login(){dataLength = sizeof(Login);cmd = CMD_LOGIN;}char userName[32];char PassWord[32]; };struct LoginResult : public DataHeader {LoginResult(){dataLength = sizeof(LoginResult);cmd = CMD_LOGIN_RESULT;result = 0;}int result; };struct Logout : public DataHeader {Logout(){dataLength = sizeof(Logout);cmd = CMD_LOGOUT;}char userName[32]; };struct LogoutResult : public DataHeader {LogoutResult(){dataLength = sizeof(LogoutResult);cmd = CMD_LOGOUT_RESULT;result = 0;}int result; };struct NewUserJoin : public DataHeader {NewUserJoin(){dataLength = sizeof(NewUserJoin);cmd = CMD_NEW_USER_JOIN;scok = 0;}int scok; };int processor(SOCKET _cSock) {//緩沖區(qū)char szRecv[4096] = {};// 5 接收客戶端數(shù)據(jù)int nLen = recv(_cSock, szRecv, sizeof(DataHeader), 0);DataHeader* header = (DataHeader*)szRecv;if (nLen <= 0){printf("與服務器斷開連接,任務結(jié)束。\n", _cSock);return -1;}switch (header->cmd){case CMD_LOGIN_RESULT:{recv(_cSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);LoginResult* login = (LoginResult*)szRecv;printf("收到服務端消息:CMD_LOGIN_RESULT,數(shù)據(jù)長度:%d\n", login->dataLength);}break;case CMD_LOGOUT_RESULT:{recv(_cSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);LogoutResult* logout = (LogoutResult*)szRecv;printf("收到服務端消息:CMD_LOGOUT_RESULT,數(shù)據(jù)長度:%d\n", logout->dataLength);}break;case CMD_NEW_USER_JOIN:{recv(_cSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);NewUserJoin* userJoin = (NewUserJoin*)szRecv;printf("收到服務端消息:CMD_NEW_USER_JOIN,數(shù)據(jù)長度:%d\n", _cSock, userJoin->dataLength);}break;} } bool g_bRun = true; void cmdThread(SOCKET sock) {while (true){char cmdBuf[256] = {};scanf("%s", cmdBuf);if (0 == strcmp(cmdBuf, "exit")){g_bRun = false;printf("退出cmdThread線程\n");break;}else if (0 == strcmp(cmdBuf, "login")){Login login;strcpy(login.userName, "lyd");strcpy(login.PassWord, "lydmm");send(sock, (const char*)&login, sizeof(Login), 0);}else if (0 == strcmp(cmdBuf, "logout")){Logout logout;strcpy(logout.userName, "lyd");send(sock, (const char*)&logout, sizeof(Logout), 0);}else {printf("不支持的命令。\n");}} }int main() {//啟動Windows socket 2.x環(huán)境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立簡易TCP客戶端// 1 建立一個socketSOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == _sock){printf("錯誤,建立Socket失敗...\n");}else {printf("建立Socket成功...\n");}// 2 連接服務器 connectsockaddr_in _sin = {};_sin.sin_family = AF_INET;_sin.sin_port = htons(4567);_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int ret = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));if (SOCKET_ERROR == ret){printf("錯誤,連接服務器失敗...\n");}else {printf("連接服務器成功...\n");}//啟動線程std::thread t1(cmdThread,_sock);t1.detach();while (g_bRun){fd_set fdReads;FD_ZERO(&fdReads);FD_SET(_sock, &fdReads);timeval t = {1,0};int ret = select(_sock, &fdReads, 0, 0, &t);if (ret < 0){printf("select任務結(jié)束1\n");break;}if (FD_ISSET(_sock, &fdReads)){FD_CLR(_sock, &fdReads);if (-1 == processor(_sock)){printf("select任務結(jié)束2\n");break;}}//printf("空閑時間處理其它業(yè)務..\n");//Sleep(1000);}// 7 關閉套節(jié)字closesocketclosesocket(_sock);//清除Windows socket環(huán)境WSACleanup();printf("已退出。\n");getchar();return 0; }

參考資料:

  • C++ 百萬并發(fā)網(wǎng)絡通信引擎架構(gòu)與實現(xiàn) (服務端、客戶端、跨平臺) Version 1.0
  • 總結(jié)

    以上是生活随笔為你收集整理的为客户端加入输入线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。