首页 > 其他分享 >Select模型

Select模型

时间:2022-10-30 22:26:37浏览次数:45  
标签:set 模型 fdSocket FD select 集合 sin Select

Select

与阻塞模式不同,Select模型管理多个Socket,同个select帮助监听socket是否发送事件,未发生

的就删除掉
#include<iostream>
#include "Init.h"
using namespace std;
Init init;
int main()
{
	USHORT nPort = 4567;	// 此服务器监听的端口号

	// 创建监听套节字
	SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(nPort);
	sin.sin_addr.S_un.S_addr = INADDR_ANY;
	// 绑定套节字到本地机器
	if(::bind(sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		printf(" Failed bind() \n");
		return -1;
	}
	// 进入监听模式
	::listen(sListen, 5);

		// select模型处理过程
	// 1)初始化一个套节字集合fdSocket,添加监听套节字句柄到这个集合
	fd_set fdSocket;		// 所有可用套节字集合
	FD_ZERO(&fdSocket);
	FD_SET(sListen, &fdSocket);
	while(TRUE)
	{
		// 2)将fdSocket集合的一个拷贝fdRead传递给select函数,
		// 当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。
		fd_set fdRead = fdSocket;
		int nRet = ::select(0, &fdRead, NULL, NULL, NULL);//帮助监听,如果未发生,就移除掉set集合
		if(nRet > 0)
		{
			// 3)通过将原来fdSocket集合与select处理过的fdRead集合比较,
			// 确定都有哪些套节字有未决I/O,并进一步处理这些I/O。
			for(int i=0; i<(int)fdSocket.fd_count; i++)
			{
				if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
				{
					if(fdSocket.fd_array[i] == sListen)		// (1)监听套节字接收到新连接
					{
						if(fdSocket.fd_count < FD_SETSIZE)
						{
							sockaddr_in addrRemote;
							int nAddrLen = sizeof(addrRemote);
							SOCKET sNew = ::accept(sListen, (SOCKADDR*)&addrRemote, &nAddrLen);
							FD_SET(sNew, &fdSocket);
							printf("接收到连接(%s)\n", ::inet_ntoa(addrRemote.sin_addr));
						}
						else
						{
							printf(" Too much connections! \n");
							continue;
						}
					}
					else
					{
						char szText[256];
						int nRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
						if(nRecv > 0)						// (2)可读
						{
							szText[nRecv] = '\0';
							printf("接收到数据:%s \n", szText);
						}
						else								// (3)连接关闭、重启或者中断
						{
							printf("对方关闭\n");
							::closesocket(fdSocket.fd_array[i]);
							FD_CLR(fdSocket.fd_array[i], &fdSocket);
						}
					}
				}
			}
		}
		else
		{
			printf(" Failed select() \n");
			break;
		}
	}
	return 0;
}

函数

  • FD_ZERO(*set) 初始化 set 为空集合。集合在使用前应该总是清空
  • FD_CLR(s, *set) 从 set 移除套接字 s
  • FD_ISSET(s, *set) 检查 s 是不是 set 的成员,如果是返回 TRUE
  • FD_SET(s, *set) 添加套接字到集合

局限

Select也不是能够无限个socket FD_SETSIZE为64 当然可以设置最多是1024

标签:set,模型,fdSocket,FD,select,集合,sin,Select
From: https://www.cnblogs.com/tsqo/p/16842432.html

相关文章

  • 生动说明Transformer,BERT,预训练模型的含义和关系
    很多知识,尽管在学会了之后发现原来是多么的简单,但是当你刚接触的时候则是完全一头雾水。在我学习自然语言处理的入门教程时,很多教程都把Transformer和BERT连在一起讲,并......
  • 9.行盒的盒模型
    #行盒的盒模型常见的行盒:包含具体内容的元素span、strong、em、i、img、video、audio##显著特点1.盒子沿着内容沿伸2.行盒不能设置宽高调整行盒的宽高,应该......
  • R语言中的BP神经网络模型分析学生成绩|附代码数据
    原文链接:tecdat.cn/?p=19936在本教程中,您将学习如何在R中创建神经网络模型(点击文末“阅读原文”获取完整代码数据)。**神经网络(或人工神经网络)具有通过样本进行学习......
  • 系列文章| R语言分布滞后线性和非线性模型DLM和DLNM建模应用|附代码数据
    有时特定暴露事件的影响并不局限于观察到的那段时间,而是在时间上有所滞后。这就带来了一个问题,即对暴露事件与未来一系列结果之间的关系进行建模,指定事件发生后不同时间的......
  • three.js 小车模型的基本结构
    基本结构代码import*asTHREEfrom'three'importStatfrom'three/examples/jsm/libs/stats.module'import{OrbitControls}from'three/examples/jsm/control......
  • mvvm与mvc模型
    什么是mvcmvc模式是modelviewcontrol通过控制器control分层开发是一种通过将复杂的业务逻辑抽离为智能单一的小模块,保证了模块的单一性,方便程序的开发维护,耦合度低什......
  • select()——老版的同步IO多路复用
    英文小册原文地址:​​beej.us/guide/bgnet…​​作者:Beej中文翻译地址:​​www.chanmufeng.com/posts/netwo…​​我假设你已经读过​​poll()​​的用法了,因此直接进入主题......
  • pytorch 训练模型很慢,卡在数据读取,卡I/O的有效解决方案
    多线程加载在datalaoder中指定​​num_works>0​​,多线程加载数据集,最大可设置为cpu核数设置​​pin_memory=True​​,固定内存访问单元,节约内存调度时间示例如下......
  • ISO/IEC软件质量模型中,质量特性及其子特性表
    ISO/IEC软件质量模型中,质量特性及子特性表功能性可靠性易用性效率可维护性可移植性适合性容错性易理解性时间特性可分析性适应性准确性易回复性易学性资源利用率可修改性可......
  • 没有 selector 的 Service
    Servcie抽象了该如何访问KubernetesPod,但也能够抽象其它类型的backend,例如:希望在生产环境中使用外部的数据库集群,但测试环境使用自己的数据库。希望服务指向另一个Name......