本文参考:https://www.cnblogs.com/china-victory/archive/2012/11/16/2773490.html
项目源码:https://pan.baidu.com/s/19jiw3epASCC2iy-KFzRlYQ 提取码: xdkw
左边是客户端的结果,右边是服务器的输出结果,客户端输入yu,服务器收到并打印,客户端输入hello,服务器收到并打印
服务器项目:
UserMeshInfo.h
#ifndef User_Mes_Sock
#define User_Mes_Sock
#include <winsock2.h>
#endif
const short MesLogin = 1001;
const short MesError = 1002;
const short MesNormal = 1003;
const short LoginSuc = 1004;
const short MesToAll = 1005;
const short OnLineUser = 1010;
//User Struct
struct UserInfo
{
short userId;
char userName[32];
SOCKET userSock;
LONG userAddr;
UserInfo *pNext;
};
//Message Struct
struct MesInfo
{
short MesType;
char fromUserName[32];
char toUserName[32];
char MesContent[1024];
};
hello_server2.cpp
#include "stdafx.h"
#include "UserMesInfo.h"
#include <iostream>
#include <cstdlib>
#include <winsock2.h>
#include <string.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
UserInfo *gUserInfo ;
string charToString(char temp[])
{
string tempStr = "";
for(int i = 0; i < sizeof(temp); i++)
tempStr += temp[i];
return tempStr;
}
DWORD WINAPI ProcMes(LPVOID lpParameter)
{
SOCKET cliSocket = ((UserInfo*)lpParameter)->userSock;
//SOCKADDR_IN sockFrom ;
char recvBuf[1024];
//int length = sizeof(SOCKADDR);
while(true)
{
memset(recvBuf, 0x00, 1024);
recv(cliSocket, recvBuf, 1024, 0);
short MesType = *(short*)recvBuf;
switch(MesType)
{
case MesLogin:
{
static short USERID = 1001;
UserInfo* userInfo = new UserInfo;
char* userName = (char*)(recvBuf + 2);
strcpy_s(userInfo->userName, userName);
userInfo->userId = USERID++;
userInfo->userSock = cliSocket;
userInfo->userAddr = ((UserInfo*)lpParameter)->userAddr;
userInfo->pNext = NULL;
if(!gUserInfo)
{
gUserInfo = userInfo;
}else
{
userInfo->pNext = gUserInfo;
gUserInfo = userInfo;
}
printf("Login : %s ==> %d !\n", userInfo->userName, userInfo->userId);
char loginInfo[4] = {0};
memcpy(loginInfo, &LoginSuc, 2);