生活随笔
收集整理的這篇文章主要介紹了
将客户端移植到Linux和MAC OS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
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> #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
;
};
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] = {};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 _WIN32WORD ver
= MAKEWORD(2, 2);WSADATA dat
;WSAStartup(ver
, &dat
);
#endifSOCKET _sock
= socket(AF_INET
, SOCK_STREAM
, 0);if (INVALID_SOCKET
== _sock
){printf("錯誤,建立Socket失敗...\n");}else {printf("建立Socket成功...\n");}sockaddr_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;}}}
#ifdef _WIN32closesocket(_sock
);WSACleanup();
#elseclose(_sock
);
#endifprintf("已退出。\n");getchar();return 0;
}
編譯選項:g++ client.cpp -std=c++11 -pthread -o client。
參考資料:
C++ 百萬并發網絡通信引擎架構與實現 (服務端、客戶端、跨平臺) Version 1.0
總結
以上是生活随笔為你收集整理的将客户端移植到Linux和MAC OS的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。