MFCTCP服务端(2)

本文分享了使用多线程改进TCP服务端编码的经验,通过一个主线程监听客户端socket,另一个线程接收数据,有效提升了服务端的处理能力。文章详细介绍了WinSock初始化、socket创建、绑定、监听及接受连接的过程,并展示了如何通过多线程处理客户端请求。

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

在上个文章中,tcp服务端有着很多的坑,这次经过改良,用了多线程来实现服务端的编码。

一个线程用于监听客户端的socket,一个用于接收数据。话不多少,直接看代码。

UINT server_thd(LPVOID P) 
{
	//初始化WinSock 如果没有这段 socket将会一直无连接!!!!!!!!!
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
	{
		return 0;
	}
	sockaddr_in local_addr;
	sockaddr_in client_addr;
	int addrSize = sizeof(sockaddr_in);
	int res;
	//char *msgg = new char[1024];
	char msg[1024];
	local_addr.sin_family = AF_INET; // 互联网地址簇	
	local_addr.sin_port = htons(8080);//端口		
	local_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//本机IP
	//	local_addr.sin_addr.S_un.S_addr=	inet_addr("192.169.13.183");  
	//创建socket套接字 
	//AF_INET 协议簇代表TCP/IP    SOCK_STREAM socket类型   IPPROTO_TCP协议类型
	listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (listen_socket == INVALID_SOCKET)
	{
		CImformationDlg ImformationDlg("网络初始化失败");
		ImformationDlg.DoModal();
		return 1;
	}
	if (bind(listen_socket, (struct sockaddr*) &local_addr, sizeof(SOCKADDR_IN)))
	{
		CImformationDlg ImformationDlg("网络初始化失败");
		ImformationDlg.DoModal();
		return 1;
	}
		listen(listen_socket, 10);// 第二个参数为套接字最大连接数
		while (true)
		{	
				sock = accept(listen_socket, (SOCKADDR *)&client_addr, &addrSize);			
				if (sock == INVALID_SOCKET) 
				{
					WSACleanup();
					exit(1);
				}
				h_RecvThread = CreateThread(nullptr,0,ReceiveThred, (LPVOID)sock,0,nullptr);
				if (h_RecvThread == NULL) 
				{
					WSACleanup;
				}
				CloseHandle(h_RecvThread);
		}
	
	//closesocket(listen_socket);
	//WSACleanup();
}
DWORD WINAPI ReceiveThred(LPVOID parameter) 
{
	SOCKET clt_Socket = (SOCKET)parameter;
	char msg[1024];
	int res = 0;
	do 
	{    //每次先清空
		memset(msg, 0, 1024);
		res = recv(clt_Socket, msg, 1024, 0);
		if (res > 0) 
		{    //根据个人需求对接收数据进行处理
			memcpy(g_SystemParam.RecData, msg, 1024);
			::SendMessage(g_SystemParam.m_pOwnerWnd->m_hWnd, IDC_WM_HADRECEIVEDATAOVER, 0, 0);
		}
        //对recv的返回值res进行判断
		else if (res == -1) 
		{
			closesocket(clt_Socket);
			return 1;
		}		
		else if (res == 0) 
		{
			break;
		}
	} while (res>0);
	res = shutdown(clt_Socket, SD_SEND);
	if (res == SOCKET_ERROR) 
	{
		closesocket(clt_Socket);
		return 1;
	}
	return 0;
}

希望和各位共同进步,如有错误,欢迎指正。

期末大作业基于python的足球运动员数据分析源码+数据集(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于pyth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值