文章目录

  • 1 将客户端移植到Linux和MAC OS
    • 1.1 概述
    • 1.2 客户端移植代码

1 将客户端移植到Linux和MAC OS

1.1 概述

我们这里把将客户端移植到Linux和MAC OS,由于Linux和MAC OS都是从Unix继承而来,所以两者关于socket部分操作接口完全相同。我们只需要关注和windows之间的差异即可。

1.2 客户端移植代码

客户端移植代码如下:
client.cpp:

#ifdef _WIN32#define WIN32_LEAN_AND_MEAN#include<windows.h>#include<WinSock2.h>#pragma comment(lib,"ws2_32.lib")
#else#include<unistd.h> //uni std#include<arpa/inet.h>#include<string.h>#define SOCKET int#define INVALID_SOCKET  (SOCKET)(~0)#define SOCKET_ERROR            (-1)
#endif#include<stdio.h>
#include<thread>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)
{//缓冲区char szRecv[4096] = {};// 5 接收客户端数据int nLen = (int)recv(_cSock, szRecv, sizeof(DataHeader), 0);DataHeader* header = (DataHeader*)szRecv;if (nLen <= 0){printf("与服务器断开连接,任务结束。\n");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,数据长度:%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,数据长度:%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,数据长度:%d\n", userJoin->dataLength);}break;}return 0;
}
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()
{#ifdef _WIN32//启动Windows socket 2.x环境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);
#endif//------------//-- 用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);
#ifdef _WIN32_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
#else_sin.sin_addr.s_addr = inet_addr("192.168.74.1");
#endifint 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 + 1, &fdReads, 0, 0, &t);if (ret < 0){printf("select任务结束1\n");break;}if (FD_ISSET(_sock, &fdReads)){FD_CLR(_sock, &fdReads);if (-1 == processor(_sock)){printf("select任务结束2\n");break;}}//printf("空闲时间处理其它业务..\n");//Sleep(1000);}// 7 关闭套节字closesocket
#ifdef _WIN32closesocket(_sock);//清除Windows socket环境WSACleanup();
#elseclose(_sock);
#endifprintf("已退出。\n");getchar();return 0;
}

编译选项:g++ client.cpp -std=c++11 -pthread -o client


参考资料:

  1. C++ 百万并发网络通信引擎架构与实现 (服务端、客户端、跨平台) Version 1.0

将客户端移植到Linux和MAC OS相关推荐

  1. 将服务端移植到Linux和MAC OS

    文章目录 1 将服务端移植到Linux和MAC OS 1.1 概述 1.2 服务端代码实现 1 将服务端移植到Linux和MAC OS 1.1 概述 这里我们将服务端移植到Linux和MAC OS,差 ...

  2. 在Linux以及Mac OS X启用F#

    随着.NET Core的推进,如今我们在Linux和Mac OS X平台上也可以和原先Windows平台之下一样运行F#程序.Microsoft的F#项目经理David Stephens先生在Buil ...

  3. 在Linux和Mac OS X系统上运行.NET

    .NET Core运行时已经看到了实现真正的跨平台的美好前景,它最终出现在Linux和Mac OS X平台上.在上周举办的Microsoft Build大会上,来自微软的项目经理Habib Heyda ...

  4. bcd 增加 引导linux系统 mac os x 系统,Windows 7+Windows XP+Ubuntu+Mac OS多系统引导完全解决方案...

    4个操作系统集成:Windows XP(选择原版最好 15G),Windows 7(选择原版最好 25G),Ubuntu(10G),Mac OS(iDeneb版Mac OS 才能安装到PC机上 20G ...

  5. bcd 增加 引导linux系统 mac os x 系统,系统引导维护工具 EasyBCD 2.4.0.237 中文多语免费版...

    EasyBCD 2.4 中文多语特别版由大眼仔旭(www.dayanzai.me)发布.EasyBCD 是一款免费软件,EasyBCD 能够极好地支持多种操作系统与 Windows 7.Vista 结 ...

  6. Skype测试支持Linux和MAC OS 皆为免费下载

    2月2日消息,网络电话软件公司Skype宣布,该公司刚刚完成Mac OS X V1.0及Linux V1.0的Skype软件测试.从即日起,在Windows上使用的Skype也可以和苹果计算机Mac ...

  7. macbook系统和linux区别,Mac OS和Linux有什么区别?

    问题描述 Apple OS X和Linux之间的主要技术差异是什么?我知道Mac和Linux都有类似的架构,那么主要的差异是什么阻止了例如mac应用程序与linux兼容? 最佳解决方法 Mac OS基 ...

  8. linux与mac os程序员,程序员为什么要使用或推荐Mac OS X?[关闭]

    我从1984年开始就在Mac上进行开发,从1989年以来就一直在* nix上进行开发,从1990年开始就一直在Windows上进行开发.拿另一半. 也许您可以在Mac上做的某些事情在Windows / ...

  9. 桂电在linux、Mac OS环境下使用出校器(支持2.14)

    这是guetsec学长在三院科协学长所抓包逆向分析1.81版出校器的基础上,用python写的一款为Mac和linux环境开发的出校器. 最后我做了略微修改,支持暂时最新版本2.14.下面有直接从源码 ...

最新文章

  1. 俄罗斯机器人雄鹿_世界上最''倒霉''的机器人:逼真到难以置信,为忍受痛苦而生...
  2. 推荐​一款Java音频视频编码器,很赞~
  3. 【方法杂谈】你真的了解CVPR吗?
  4. python学习笔记(十五)标准库StringIO和BytesIO
  5. U盘版便携式Linux制作, casper-rw 解析
  6. VUE2第五天学习---自定义指令
  7. Leetcode309. Best time to sell stock with cooldown
  8. 如何搭建一对一直播PHP直播系统源码的流程
  9. 健身中有氧运动和无氧运动是什么?它们有什么区别?
  10. web前端基础 html5+css3(七.PS切图与项目实战(学成在线))
  11. 关于redis服务的代码编码
  12. LA 7456 Least Crucial Node
  13. 小区安装人脸识别系统,先回答五大安全问题
  14. html实训报告致谢,毕业论文致谢信(精选10篇)
  15. 关于map与set的count的时间复杂度(个人观点,不正确请指出)
  16. 计算机机房标准pdf,计算机机房建设标准要点.pdf
  17. 【​观察】得生态者得云天下 阿里、腾讯、浪潮、华为对决云计算2.0
  18. matlab的pnpoly,PNPoly 算法
  19. 超级好用的php文件上传类(上传、缩略图、水印)
  20. 怎么查看linux系统下数据库的进程数,如何查看sybase数据库运行情况

热门文章

  1. 电脑qq文件服务器地址,在电脑上接收QQ地理位置打不开,提示获取不到详细地址...
  2. php图片传入及改名代码,WordPress添加媒体中文名图片上传改名(优化版)
  3. mysql中uuid的写法_MySQL IS_UUID()用法及代码示例
  4. c6011取消对null指针的引用_C++中的野指针及其规避方法
  5. 【问题解决】微软OneNote使用笔记,Ditto解决OneNote复制粘贴文本输出图片问题
  6. 【方案】0519冰箱运行监测系统:方案分析
  7. 计算机课四年级说课稿,小学信息技术说课稿
  8. 【跃迁之路】【448天】刻意练习系列207(2018.04.29)
  9. 学习开发自己的composer包,并使用GitHub实时更新到Packagist
  10. 用nodejs搭建最简单、轻量化的http server