服务端
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;
enum CMD
{
CMD_LOGIN,
CMD_LOGINOUT,
CMD_ERROR
};
struct DataHeader
{
short dataLength;
short cmd;
};
struct Login
{
char userName[32];
char PassWord[32];
};
struct LoginResult
{
int result;
};
struct Loginout
{
char userName[32];
};
struct LoginoutResult
{
int result;
};
int main()
{
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in _sin = { };
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
{
printf("错误,绑定网络端口失败...\n");
}
else {
printf("绑定端口成功...\n");
}
if (SOCKET_ERROR == listen(_sock, 5))
{
printf("错误,监听网络端口失败...\n");
}
else {
printf("监听网络端口成功...\n");
}
sockaddr_in _clientAddr = { };
int nAddrLen = sizeof(_clientAddr);
SOCKET _cSock = INVALID_SOCKET;
char msgBuf[] = "HELLO, I'm Server";
char _recvBuf[128] = { };
_cSock = accept(_sock, (sockaddr*)&_clientAddr, &nAddrLen);
if (INVALID_SOCKET == _cSock)
{
printf("错误,接收到无效客户端SOCKET...\n");
}
printf("新客户加入:IP = %s ,socket = %d \n", inet_ntoa(_clientAddr.sin_addr), (int)_cSock);
while (true)
{
DataHeader header = { };
int nLen = recv(_cSock, (char*)&header, sizeof(DataHeader), 0);
if (nLen <= 0)
{
printf("客户端已退出,任务结束。");
break;
}
printf("收到命令:%d 数据长度: %d\n", header.cmd, header.dataLength);
switch (header.cmd)
{
case CMD_LOGIN:
{
Login login = { };
recv(_cSock, (char*)&login, sizeof(Login), 0);
LoginResult ret = { 0 };
send(_cSock, (char*)&header, sizeof(DataHeader), 0);
send(_cSock, (char*)&ret, sizeof(LoginResult), 0);
}
break;
case CMD_LOGINOUT:
{
Loginout loginout = { };
recv(_cSock, (char*)&loginout, sizeof(Loginout), 0);
LoginoutResult ret = { 0 };
send(_cSock, (char*)&header, sizeof(DataHeader), 0);
send(_cSock, (char*)&ret, sizeof(LoginoutResult), 0);
}
break;
default:
header.cmd = CMD_ERROR;
header.dataLength = 0;
send(_cSock, (char*)&header, sizeof(DataHeader), 0);
break;
}
}
closesocket(_sock);
WSACleanup();
getchar();
return 0;
}
客户端
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;
enum CMD
{
CMD_LOGIN,
CMD_LOGINOUT,
CMD_ERROR
};
struct DataHeader
{
short dataLength;
short cmd;
};
struct Login
{
char userName[32];
char PassWord[32];
};
struct LoginResult
{
int result;
};
struct Loginout
{
char userName[32];
};
struct LoginoutResult
{
int result;
};
struct DataPackage
{
int age;
char name[32];
};
int main()
{
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
SOCKET _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);
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int ret = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));
if (ret == SOCKET_ERROR)
{
printf("错误,连接失败...\n");
}
else {
printf("连接成功...\n");
}
while (true)
{
char cmdBuf[128] = { };
scanf("%s", cmdBuf);
if (0 == strcmp(cmdBuf, "exit"))
{
break;
}
else if (0 == strcmp(cmdBuf, "login"))
{
Login login = { "yql","yqlyyds" };
DataHeader header = { sizeof(login),CMD_LOGIN };
send(_sock, (const char*)&header, sizeof(header), 0);
send(_sock, (const char*)&login, sizeof(login), 0);
DataHeader retHeader = { };
LoginResult loginRet = { };
recv(_sock, (char*)&retHeader, sizeof(DataHeader), 0);
recv(_sock, (char*)&loginRet, sizeof(LoginResult), 0);
printf("LoginResult: %d \n", loginRet.result);
}
else if (0 == strcmp(cmdBuf, "loginout"))
{
Loginout loginout = { };
DataHeader header = { sizeof(loginout),CMD_LOGINOUT };
send(_sock, (const char*)&header, sizeof(header), 0);
send(_sock, (const char*)&loginout, sizeof(loginout), 0);
DataHeader retHeader = { };
LoginResult loginoutRet = { };
recv(_sock, (char*)&retHeader, sizeof(DataHeader), 0);
recv(_sock, (char*)&loginoutRet, sizeof(LoginoutResult), 0);
printf("LoginoutResult: %d \n", loginoutRet.result);
}
else {
printf("不支持的命令,请重新输入。\n");
}
}
closesocket(_sock);
WSACleanup();
printf("客户端已退出,任务结束...\n");
getchar();
return 0;
}