C++ socket Recv()函数

本文介绍了一个网络通信处理流程,详细解析了如何通过socket接收客户端发送的不同类型的数据包,并对这些数据包进行处理,例如登录验证和登出操作。文中还展示了如何发送响应结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int processor(SOCKET _clientSock) {
	//第一次接受一个缓冲数据
	char szRecv[1024] = {};
	//5.接收客户端数据
	//第一次收了header的数据包,只剩下CMD的数据长度,指针移动到数据包包体位置
	//这里szRECV被接收到了有DataHeader的长度。数据仍在recv中储存,没有改变recv的数据大小,只是从recv开头中取了dataheader的大小的数据
	//如果是szRecv那就默认从szRecv【0】的位置开始储存 DataHeader长度的数据,都是存在recv中
	int nLen = recv(_clientSock, szRecv, sizeof(DataHeader), 0);
	//把recv当中的收到Dataheader长度的数据转化成DataHeader数据结构,存在header中
	DataHeader* header = (DataHeader*)szRecv;

	if (nLen <= 0)
	{
		printf("客户端<%d>已经退出,任务结束。",_clientSock);
		return -1;
	}
	printf("收到命令:%d ,数据长度:%d\n", header->cmd, header->dataLength);
	//6.处理请求
	if (nLen >= sizeof(DataHeader))
		switch (header->cmd)
		{
		case CMD_LOGIN:
		{

			//取剩余的长度
			//  收数据包的sock      szRecv+sizeof(DataHeader)是一个存放数据的地方            存放数据的长度是header的datalength-dataheader
			//从clientsock中接收,指针从szRecv【0】+sizeof(dataheader)的地方储存长度为,包的长度-包头的长度的数据,都是存在szRecv中
			//Recv是一个指针也就是头指针在Recv开头的位置,szRecv+sizeof(DataHeader)就是在szRecv中移动到头,0+sizeof(Dataheader)的位置
			recv(_clientSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
			Login* login = (Login*)szRecv;
			//判断用户名和密码是否正确
			std::cout << login->userName << "  " << login->PassWord << std::endl;
			char name[32] = "李逵";
			char pw[32] = "110";
			if (0 == (strcmp(name, login->userName) | strcmp(pw, login->PassWord)))
			{
				//这个数据包的长度为32+32+2+2=68
				printf("<Socket %d>输入正确!,name is %s , password is %s ,数据长度:%d \n",_clientSock, login->userName, login->PassWord, login->dataLength);
				//short 的长度为2
				std::cout << "sizeof cmd " << sizeof(login->cmd) << "  " << "sizeof datalength" << sizeof(login->dataLength) << std::endl;
			}

			else
				printf("<Socket %d>重新输入密码\n",_clientSock);
			LoginResult result;

			//7.发送请求
			//一定要先发送消息头,然后在发送消息体,这样才是一个完整的报文
			//传过来的header带有cmd,根据cmd选择参数命令。所以直接返回接收的header就行
			send(_clientSock, (char*)&result, sizeof(LoginResult), 0);
		}
		break;

		case CMD_LOGOUT:
		{

			recv(_clientSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
			Logout* logout = (Logout*)szRecv;
			printf("<Socket %d>登出!,name is %s ,数据长度:%d \n",_clientSock, logout->userName, logout->dataLength);

			LogoutResult result;
			send(_clientSock, (char*)&result, sizeof(LogoutResult), 0);
		}
		break;
		//定义默认的错误信息
		default:
		{
			DataHeader header = { 0,CMD_ERROR };
			send(_clientSock, (char*)&header, sizeof(DataHeader), 0);
		}
		break;
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值