winsock I/O selec/WSAEventSelect模型

本文详细探讨了Windows下网络编程中常用的两种I/O模型——select和WSAEventSelect。通过比较它们的工作原理、优缺点,帮助开发者理解如何在实际应用中选择合适的模型进行异步网络通信。
摘要由CSDN通过智能技术生成

select模型

#include<Winsock2.h>
#include<stdio.h>

#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)

/*
//创建服务器套接字 
socket
//绑定本地地址 
bind
//进入监听模式 
listen
//select模式 
//构造fd_set集合 
fd_set fdSocket;
//清空fd_set集合并将服务器套接字加入 
FD_ZERO(&fdSocket);
FD_SET(sListen, &fdSocket);
//循环 
//复制一份fd_set集合并放入select中检测 
fd_set fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
//根据select结果进行相应处理(accept read ) 
*/

int main()
{
	//加载套接字库
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	//创建套接字
	SOCKET ser = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	//绑定套接字
	SOCKADDR_IN addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(4096);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;
	int b = bind(ser, (sockaddr*)&addr, sizeof(addr));
	if (bind != 0)
	{
		printf("bind error");
		return -1;
	}
	//监听
	listen(ser, 5);

	//select处理
	//初始化文件描述符。添加套接字句柄
	fd_set fdSocket;
	FD_ZERO(&fdSocket);
	FD_SET(ser, &fdSocket);
	while (1)
	{
		//将fdsocket集合的一个拷贝fdRead传递给select函数
		//当有时间发生,select函数移除fdRead集合中没有未决I/O操作的套接字句柄,返回
		fd_set fdRead = fdSocket;
		int nRet = select(0, &fdRead, NULL, NULL, NULL);
		if (nRet > 0)
		{
			//将原来集合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] == ser)  //监听套接字收到新连接
					{
						if (fdSocket.fd_count < FD_SETSIZE)  //如果小于fd_set总数,则将新接受的连接添加进来
						{
							sockaddr_in addrRemote;
							int nAddrLen = sizeof(addrRemote);
							
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值