⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 select.cpp

📁 WinSocket各种阻塞非阻塞模式的简单例子都已通过调试适合网络编程初学者
💻 CPP
字号:
#include "../comm/initsock.h"
#include <stdio.h>

CInitSock initSock;

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模型处理过程
	//初始化一个套接字集合,添加监听套接字句柄到这个集合
	fd_set fdSocket; 
	FD_ZERO(&fdSocket);
	FD_SET(sListen, &fdSocket);
	while (TRUE)
	{
		//将集合的一个拷贝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] == sListen)
					{
						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)
						{
							szText[nRecv] = '\0';
							printf("接受数据:%s\n", szText);
						}
						else
						{
							::closesocket(fdSocket.fd_array[i]);
							FD_CLR(fdSocket.fd_array[i], &fdSocket);
						}
					}
				}
			}
		}
		else
		{
			printf("Failed select()\n");
			break;
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -