WSA事件模型

news2024/12/23 7:45:55

服务端骨架:


#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>


int main()
{
	WSADATA lpWSAData;
	WSAStartup(MAKEWORD(2, 2), &lpWSAData);

	SOCKADDR_IN saddr{ 0 };
	saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(9527);

	SOCKET SerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	bind(SerSocket, (PSOCKADDR)&saddr, sizeof(saddr));

	SOCKET arrSocket[WSA_MAXIMUM_WAIT_EVENTS]{ 0 };
	WSAEVENT arrEvent[WSA_MAXIMUM_WAIT_EVENTS]{ 0 };
	WSAEVENT nEvent = WSACreateEvent();
	WSAEventSelect(SerSocket, nEvent, FD_ACCEPT);
	DWORD dwindex = 0;
	arrSocket[dwindex] = SerSocket;
	arrEvent[dwindex] = nEvent;
	dwindex++;

	listen(SerSocket, SOMAXCONN);

	while (true)
	{
		DWORD EventIndex = WSAWaitForMultipleEvents(dwindex, arrEvent, FALSE, WSA_INFINITE, FALSE);
		EventIndex -= WSA_WAIT_EVENT_0;

		WSANETWORKEVENTS NetworkEvents;
		WSAEnumNetworkEvents(arrSocket[EventIndex], arrEvent[EventIndex], &NetworkEvents);

		if (NetworkEvents.lNetworkEvents & FD_ACCEPT)
		{
			if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] == 0)
			{
				SOCKADDR_IN caddr{ 0 };
				int length = sizeof(caddr);
				SOCKET NewSocket = accept(SerSocket, (PSOCKADDR)&caddr, &length);

				nEvent = WSACreateEvent();
				WSAEventSelect(NewSocket, nEvent, FD_READ|FD_WRITE|FD_CLOSE);
				arrSocket[dwindex] = NewSocket;
				arrEvent[dwindex] = nEvent;
				dwindex++;

				printf("Client IP:%s Prot:%d\r\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
			}
		}
		else if (NetworkEvents.lNetworkEvents & FD_READ)
		{
			if (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)
			{
				char szbuffer[1024]{ 0 };
				recv(arrSocket[EventIndex], szbuffer, sizeof(szbuffer), 0);
				printf("Client Data:%s\r\n", szbuffer);
				std::string str = "收到";
				send(arrSocket[EventIndex], str.c_str(), str.length(), 0);
			}
		}
		else if (NetworkEvents.lNetworkEvents & FD_WRITE)
		{
			if (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)
			{
				printf("The client is ready\r\n");
			}
		}
		else if (NetworkEvents.lNetworkEvents & FD_CLOSE)
		{
			for (size_t i = 0; i < dwindex; i++)
			{
				WSACloseEvent(arrEvent[EventIndex]);
				closesocket(arrSocket[EventIndex]);
				dwindex--;
			}
		}
	}
	WSACleanup();
	system("pause");
	return 0;
}

客户端骨架:


#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#include <process.h>

void RecvData(PVOID pt)
{
	SOCKET sock = *(SOCKET*)pt;
	char szbuffer[1024]{ 0 };
	while (true)
	{
		if (recv(sock, szbuffer, sizeof(szbuffer), 0) == SOCKET_ERROR)
		{
			DWORD dwError = WSAGetLastError();
			if (dwError == WSAETIMEDOUT || dwError == WSAENETDOWN || dwError == WSAECONNRESET)
			{
				closesocket(sock);
				WSACleanup();
				return;
			}
			if (dwError == WSAEWOULDBLOCK)
			{
				Sleep(5);
				continue;
			}
		}
		std::cout << "Server Data:" << szbuffer << std::endl;
	}
}

int main()
{
	WSADATA lpWSAData;
	WSAStartup(MAKEWORD(2, 2), &lpWSAData);

	SOCKADDR_IN caddr{ 0 };
	caddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	caddr.sin_family = AF_INET;
	caddr.sin_port = htons(9527);

	SOCKET CliSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	int iMode = 1;//这行代码将套接字设置为非阻塞模式。这意味着在调用 connect、send 或 recv 等函数时,如果操作不能立即完成,函数不会阻塞,而是立即返回一个错误。
	ioctlsocket(CliSocket, FIONBIO, (u_long*)&iMode);

	connect(CliSocket, (PSOCKADDR)&caddr, sizeof(caddr));

	_beginthread(RecvData, 0, &CliSocket);

	while (true)
	{
		std::cout << "Input:";
		std::string str;
		std::cin >> str;
		send(CliSocket, str.c_str(), str.length(), 0);
		Sleep(20);
	}
	system("pause");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【生日视频制作】海上绿色摩托艇汽车艇车身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程海上绿色摩托艇汽车艇车身AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板替换工程 怎么如何做的【生日视频制作】海上绿色摩托艇汽车艇车身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模…

单点登录问题【拼多多0905一面】

说一些今晚情况&#xff0c;7点腾讯音乐笔试&#xff0c;因为8点拼多多一面&#xff0c;哪个都拒不了。硬着头皮50分钟写了1.2题然后去面试。刚开始状态真的很差&#xff0c;大脑思考不动&#xff0c;面试中2个手撕&#xff0c;做出来一个&#xff0c;两个项目问题&#xff0c;…

用Java实现一个简易的炸金花小游戏

最近闲暇时间写了个用Java实现的简易版的炸金花小游戏&#xff0c;还是很有趣的&#xff0c;下面具体来介绍下具体实现。 下面这个是初始化页面。 一、设计思路 1、首先要了解炸金花的游戏规则&#xff0c;针对整个游戏过程来考虑。从游戏开始后的抽牌选出庄家&#xff0c;再到…

shell 中的grep sed awk命令

目录 一、grep命令 1.基本格式 2.常用命令 3. sort 命令 3.1 格式 3.2 常用选项 4. uniq 快捷去重 4.1 格式 5. tr 命令 5.1 格式 5.2 常用选项 练习&#xff1a; 二、sed 命令 1. sed基本概念 2. 基本操作格式 3. 常用选项 4. 应用 5. 文本模式过滤行内容 6. s…

C#自定义控件的放置与拖动

1、自定义控件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace PartA…

【mysql】mysql修改sql_mode之后无法启动

现象&#xff1a;修改后mysql无法启动&#xff0c;不报错 原因&#xff1a;MySQL在8以后sql_mode已经取消了NO_AUTO_CREATE_USER这个关键字。去掉这个关键字后&#xff0c;启动就可以了 修改前&#xff1a; sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR…

jenkins 工具使用

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要的环节&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;…

查看当前主机的硬盘是固态硬盘还是机械硬盘

windows主机下查看硬盘类型方法&#xff1a; 打开dos界面&#xff0c;输入 powershell进入powershell界面 在PowerShell窗口中&#xff0c;输入 Get-PhysicalDisk 命令并按回车。 发现MediaType下面的值为HDD,即为机械硬盘&#xff0c;如果是固态硬盘&#xff0c;则为SSD

什么是CDN及其如何影响SEO?

有没有想过&#xff0c;为什么你的网站在谷歌搜索结果的后几页徘徊&#xff0c;即使你已经优化了每一个网页&#xff1f; 有时候&#xff0c; 慢速的网站性能可能是罪魁祸首。 如果这个问题引起了你的共鸣&#xff0c;那么你可能想要探索一下内容分发网络&#xff08;Content…

Android平台通过RTSP服务实现摄像头麦克风共享

技术背景 前些年&#xff0c;我们在完成Android平台RTMP直播推送模块后&#xff0c;遇到这样的技术需求&#xff0c;好多开发者希望在Android平台&#xff0c;实现摄像头和麦克风音视频数据采集编码打包后&#xff0c;对外提供RTSP&#xff08;Real Time Streaming Protocol&a…

【DEV工具-IDEA】新建springboot项目,无法选择java8?

问题&#xff1a;新建springboot项目&#xff0c;无法选择java8。 #解决&#xff1a; 替换为 &#xff1a;https://start.aliyun.com

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序 文章目录 一、基本原理DBO&#xff08;Dung Beetle Optimization&#xff09;算法原理LSSVM&#xff08;Least Squares Support Vector Machine&#xff09;模型原理DBO-LSS…

【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门

1. C#与.NET的发展历程 C#是由Microsoft开发的现代编程语言&#xff0c;最初伴随着.NET Framework发布。随着技术的进步&#xff0c;特别是针对跨平台开发的需求&#xff0c;Microsoft推出了.NET Core&#xff0c;这是一个开源且跨平台的框架&#xff0c;支持Windows、macOS和…

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装&#xff0c;signature_pad本身是web端的插件&#xff0c;此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…

Windows10 安全加固之禁止光驱、U盘等自动播放

在使用Windows10系统的电脑中插入插入光盘或者U盘时,默认是自动播放的,这样会引入一些可能不安全的因素。因此,为了系统安全,有必要禁止光驱、U盘等自动播放。具体方法如下: 方法一:通过设置页面关闭 第1步:单击win10系统的“开始”菜单->“设置”,打开“windows设…

算法:区间dp

文章目录 一、适用场景二、基本思路步骤时间复杂度&#xff1a; 三、例题 区间动态规划&#xff08;Interval DP&#xff09;是一种用于解决某些需要处理区间或子段问题的动态规划方法&#xff0c;特别适合于问题的解可以通过子区间的解进行组合的情况。该方法的核心思想是在子…

pico手柄和人物模型手部旋转同步,实现手柄控制手臂手部位置移动、手部旋转和手指的操作了

这里的主要内容就是下述代码&#xff1b; // 获取左手控制器的旋转&#xff08;四元数表示&#xff09;Quaternion aRotationQuaternion leftHandController.rotation;// 计算旋转差值&#xff08;四元数表示&#xff09;Quaternion rotationDifference Quaternion.Euler(0, …

Qt创建项目及相关问题

文章目录 1. Qt项目创建2. 认识项目代码main.cppwidget.hwidget.cppwidget.ui.pro构建过程生成的中间文件 3. Hello World程序图形化方式创建代码方式创建内存泄漏问题编辑框方式创建按钮方式创建 4. 对象树引入对象树原因对象树自动释放对象实验演示 5. 乱码问题 1. Qt项目创建…

Databend 产品月报(2024年8月)

很高兴为您带来 Databend 2024 年 8 月的最新更新、新功能和改进&#xff01;我们希望这些增强功能对您有所帮助&#xff0c;并期待您的反馈。 Kafka Connect Sink Connector 插件 我们推出了一种将 Kafka 连接到 Databend 的新方式&#xff1a;databend-kafka-connect&#…

2023Idea版本无法下载通义灵码插件以及无法登录问题

进入下载插件处 在插件主页安装时&#xff0c;通常会根据当前自己访问的IDEA版本推荐合适的插件版本&#xff0c;所以最终会安装成功 idea中通义灵码插件无法登录问题