`
daojin
  • 浏览: 694863 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

最简单的WSAEventSelect模型(注意注释的地方)

阅读更多
// Win32SocketTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "winsock2.h"
//#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"Ws2_32.lib")
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
	int arg = 1000;
	int theOp = ~arg + 1;
	int theOp2 = ~theOp + 1;
	//启动socket
	WSADATA data;
	WSAStartup(MAKEWORD(2,2),&data);
	//设置服务器地址
	SOCKADDR_IN addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(5000);
	addr.sin_addr.S_un.S_un_b.s_b1 = 113;
	addr.sin_addr.S_un.S_un_b.s_b2 = 90;
	addr.sin_addr.S_un.S_un_b.s_b3 = 50;
	addr.sin_addr.S_un.S_un_b.s_b4 = 170;
	int len = sizeof(addr);

	//创建socket
	SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

	//绑定socket
	bind(s,(sockaddr*)&addr,sizeof(addr));
	while(true)
	{
		//监听socket
		listen(s,SOMAXCONN);

		//创建与socket关联的事件
		WSAEVENT event = WSACreateEvent();
		WSAEventSelect(s,event,FD_ACCEPT | FD_CLOSE);

		//等待事件发生
		//////////////////////////////////////////////////////////////////////////
		//阻塞!必须建立线程去处理。。以后改进。
		DWORD nResult = WaitForSingleObject(event, INFINITE);
		if (nResult == WAIT_OBJECT_0)
		{
			//查询是什么事件发生了。
			WSANETWORKEVENTS ne;
			WSAEnumNetworkEvents(s,event,&ne);
			if (ne.lNetworkEvents&FD_ACCEPT)
			{
				//为这个客户端建立一个套接字用来收发数据。
				SOCKADDR_IN clientAddr;
				int addrlen = sizeof(clientAddr);
				SOCKET sClient = accept(s, (sockaddr*)&clientAddr, &addrlen);

				//////////////////////////////////////////////////////////////////////////
				/////阻塞!必须建立线程去处理。。以后改进。	
				WSAEVENT eventWriteRead = WSACreateEvent();
				WSAEventSelect(sClient,eventWriteRead,FD_WRITE|FD_READ|FD_CLOSE);
				while (true)
				{
					WaitForSingleObject(eventWriteRead,INFINITE);
					{
						//查询是什么事件发生了。
						WSANETWORKEVENTS ne;
						WSAEnumNetworkEvents(sClient,eventWriteRead,&ne);
						if (ne.lNetworkEvents&FD_WRITE)
						{
							char a[1000];
							memset(a,0,sizeof(a));
							std::cin>>a;
							send(sClient, a, sizeof(a),0);
						}
						else if (ne.lNetworkEvents&FD_READ)
						{
							char buf[1000];
							buf[999] = 0;
							recv( sClient,buf,len,0);
							std::cout<<buf;
						}
						else if (ne.lNetworkEvents&FD_CLOSE)
						{
							closesocket(s);
						}
					}
					WSAResetEvent(eventWriteRead);
				}
				//////////////////////////////////////////////////////////////////////////
				
			}
			else
			{
				closesocket(s);
			}
		} 
		//////////////////////////////////////////////////////////////////////////
		WSAResetEvent(event);
		
	}
	return 0;
}

 要改进的地方

1。阻塞的地方waiforsingle改为waitformultiple,并且用线程去处理。

2。用短连接代替长连接来处理。收到一个完整的业务包之后,进行关闭。

分享到:
评论

相关推荐

    WSAEventSelect模型

    WSAEventSelect模型

    WSAEventSelect模型基础 VS2010 、C

    **WSAEventSelect模型基础** 在Windows Socket编程中,`WSAEventSelect`是一个关键的API函数,它允许程序员将套接字与Windows事件对象关联起来。这种模型为多路复用I/O提供了基础,使得应用程序可以等待多个网络...

    WSAEventSelect模型服务端与测试程序

    《WSAEventSelect模型在服务端与测试程序中的应用详解》 在计算机网络编程领域,WSAEventSelect是一个至关重要的接口,它允许开发者将套接字事件与Windows事件对象关联起来,实现异步I/O操作。这个模型对于构建高效...

    基于WSAEventSelect模型的通信程序设计

    编写Win32程序模拟实现基于WSAEventSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递。客户端向服务器端发送“请输出从1到1000内所有的水仙花数”,服务器回应客户端给出结果。...

    wsaEventSelect事件选择模型

    **wsaEventSelect事件选择模型详解** 在计算机网络编程中,特别是在Windows系统下进行低级套接字编程时,`wsaEventSelect`是一个至关重要的API函数。它提供了基于事件的I/O模型,使得开发者可以处理多个套接字的...

    Winsock模型之WSAEventSelect(事件通知)

    Winsock 模型之 WSAEventSelect(事件通知) Winsock 模型之 WSAEventSelect(事件通知) 是一种异步 I/O 模型,它允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。该模型的主要特点是网络事件会...

    多线程下的WSAEventSelect模型

    http://blog.csdn.net/wangjieest/article/details/7042108 http://blog.csdn.net/ithzhang/article/details/8476556

    WSAEventSelect客户端

    `WSAEventSelect`是Windows Socket API提供的一种I/O模型,它允许应用程序通过事件对象来监控网络活动,从而提高效率并简化异步编程。在`VC++ 6.0`中,这个功能特别有用,因为它是那个时代广泛使用的开发工具。 ...

    采用C++语言实现的WSAEventSelect I/O模型

    在本文中,我们将深入探讨如何使用C++编程语言来实现基于WSAEventSelect的I/O模型。WSAEventSelect是Windows Socket API(Winsock)提供的一种异步I/O机制,它允许应用程序通过等待网络事件来处理多个套接字。这个...

    Winsock WSAEventSelect(单线程) 服务端模型源码

    本篇内容将详细解释WSAEventSelect在单线程服务端模型中的应用,并通过源码解析其工作原理和实现方式。 1. **WSAEventSelect的基本概念** WSAEventSelect函数允许开发者指定一个或多个套接字事件,当这些事件发生...

    VC网络编程模型示例 - WSAEventSelect

    **VC网络编程模型示例 - WSAEventSelect** 在Windows Socket API (Winsock)中,`WSAEventSelect`是一个重要的函数,它允许程序通过事件对象(如Windows事件或I/O完成端口)来处理网络事件。这个模型在Visual C++...

    WSAEventSelect事件选择网络模型

    **WSAEventSelect事件选择网络模型** 在Windows Socket API(Winsock)中,WSAEventSelect是用于将网络事件与Windows事件对象关联的关键函数。它允许程序员使用Windows事件处理机制来管理套接字的异步操作,从而...

    WSAEventSelect

    `WSAEventSelect`是Windows Socket API中一个核心的函数,它主要用于在多路复用I/O模型中注册网络事件,允许开发者以异步的方式处理套接字操作。在Windows平台上进行网络编程时,`WSAEventSelect`是实现非阻塞I/O和...

    基于WSAEventSelect的多线程服务器C++程序

    本教程将深入探讨如何利用Windows Socket API(WSA)中的`WSAEventSelect`函数,结合多线程技术来构建一个高效的C++服务器程序。`WSAEventSelect`是Windows平台下异步I/O操作的核心机制,它允许程序注册对特定套接字...

    socket中wsaeventselect,iocp

    在Windows Socket编程中,有多种I/O模型可供选择,其中包括WSAAsyncSelect和WSAEventSelect,以及IOCP(I/O完成端口)模型。这些模型主要用来处理网络通信中的异步I/O操作,提高系统的并发性能。 首先,让我们详细...

    WSAEventSelect多线程服务器

    2 界面基于对话框 使用WSAAsyncSelect和WSAEventSelect两个模型 这是因为使用了界面 前者对消息开放 后者完成网络服务 3 有文档 有测试程序 4 代码只有200多行 比书上少了100行 容易阅读多了 三个类SockectOjb ...

    详解WSAEventSelect网络模型-附件资源

    详解WSAEventSelect网络模型-附件资源

    Winsock WSAEventSelect(多线程) 服务端模型源码

    在"Winsock WSAEventSelect 服务端模型源码"中,我们可以预见到以下关键知识点: 1. **套接字(Socket)**:套接字是网络通信中的基本概念,它是进程间通信的一种方式,特别是在Internet上的进程间通信。创建套接字...

Global site tag (gtag.js) - Google Analytics