基于事件的异步套接字

原创 2012年03月30日 11:18:33
主要用到的是WSAEventSelect模型


下面是一个简单的示例代码:
		//控制箱开机
		char *pCmd = "ONCP\r\n";
		SOCKET	sck=socket(PF_INET,SOCK_STREAM,0);
		if(INVALID_SOCKET ==sck)
			ATLASSERT(0);
		WSAEVENT hEvent = WSACreateEvent();
		WSAEventSelect(sck,hEvent,FD_READ|FD_CONNECT);

		struct sockaddr_in to;
		to.sin_family=AF_INET;
		to.sin_port=htons(SOCKET_POWERPORT);
		to.sin_addr.s_addr=htonl(pconfig->dwIP);

		try
		{
			WSAConnect(sck,(struct sockaddr*)&to,sizeof(to),NULL,NULL,NULL,NULL);
			int nTry=10;
			int ret=0;
			int err=-1;
			BYTE buffer[1024]={0};
			int i=0;
			for(i=0;i<30;i++)
			{
				if(WSAWaitForMultipleEvents(1,&hEvent,0,100,0)!=WSA_WAIT_EVENT_0)
				{
					err = -1;
				}
				else
				{
					WSANETWORKEVENTS events;
					WSAEnumNetworkEvents(sck,hEvent,&events);
					if( (events.lNetworkEvents | FD_CONNECT)==0 || events.iErrorCode[4]!=0)
					{
						err = -1;
					}
					else
						err=0;
				}
				
				if(err==0) break;
				Sleep(100);
			}

			if (err != 0)	
			{
				//错误
				*bstrMsg = SysAllocString(L"连接控制器失败,请检查控制器地址配置是否正确");
				throw(1);
			}
			else 
			{
				while(--nTry)
				{
					if(nTry<9)
						Sleep(1000);
					ret=send(sck,(const char*)pCmd, strlen(pCmd),0);
					if( ret!=strlen(pCmd) )
					{
						*bstrMsg = SysAllocString(L"错误:发送数据失败");
						throw(5);
					}

					//接收返回数据
					for(i=0;i<30;i++)
					{
						ret=0;
						ret=recv(sck, (char*)buffer, 1023, 0);
						if(ret > 0)
							break;
						Sleep(100);
					}

					//容错M61E
					//if(ret==1)
					if(ret>0)
					{
						if( buffer[0]==0)
						{
							*lSuccess= TRUE;
							throw(0);
						}
						continue;
					}

					else
					{
						continue;
					}
				}//end while(nTry--)
			}

			if(ret>0)
			{
				if( buffer[0]==1)
				{
					*bstrMsg = SysAllocString(L"错误:开启计算机失败,请等待3分钟后再进行操作");
					throw(2);
				}
				else if( buffer[0]==2)
				{
					*bstrMsg = SysAllocString(L"错误:计算机已开启");
					throw(3);
				}
				else if( buffer[0]==3)
				{
					*bstrMsg = SysAllocString(L"错误:正在开机过程中");
					throw(4);
				}
				else
				{
					OutputDebugString("接收开机指令返回不符合协议");
					*bstrMsg = SysAllocString(L"接收开机指令返回不符合协议");
				}
			}
			else
			{
				OutputDebugString("接收开机指令失败:指令无返回");
				*bstrMsg = SysAllocString(L"接收开机指令失败:指令无返回");
				throw(5);
			}
		}
		catch(int err)
		{
			if(sck!=INVALID_SOCKET)
			{
				closesocket(sck);
			}
			sck=INVALID_SOCKET;
			
			if(err)
			{
				*lSuccess= FALSE;
				return S_FALSE;
			}
			else
			{
				*lSuccess= TRUE;
				return S_OK;
			}
		}




网络编程——基于消息的异步套接字编程

Windows套接字在两种模式下执行I/O操作,一种是阻塞模式,一种是非阻塞模式。在阻塞模式下,在I/O操作完成之前,执行I/O操作的Winsock函数会一直等待下去,不会立即返回程序,将控制权交回程...
  • Sayesan
  • Sayesan
  • 2015年02月04日 15:39
  • 1032

套接字 同步 异步

多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接...
  • minglingji
  • minglingji
  • 2012年05月09日 16:26
  • 2582

windows上基于消息的异步套接字及其网络聊天室编写

一、
  • Sharing_Li
  • Sharing_Li
  • 2014年08月31日 01:32
  • 1126

基于事件的异步模式

          本篇学习了基于事件的异步模式。问题的提出:基于IAsyncResult接口的异步模式.在异步回调中,回调线程不同于调用线程。使用Windows窗体或WPF时,这就是个问题,因为Wi...
  • Joetao
  • Joetao
  • 2010年10月14日 16:24
  • 1986

MFC:异步套接字编程举例—网络聊天室程序

网络聊天室程序(MFC:利用win32的扩展函数): int WSAStartup(   WORD wVersionRequested,   LPWSADATA lpWSAData ); 一...
  • u010002704
  • u010002704
  • 2014年10月11日 14:04
  • 1387

网络编程——多线程与异步套接字编程(API) 学习

1.多线程技术 1.1 创建线程 在VC中编写程雪,调用API函数CreateThread()创建线程。 该函数原型如下: HANDLE CreateThread( LPSECURITY_AT...
  • bingbingzyb
  • bingbingzyb
  • 2016年04月21日 22:28
  • 479

写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别

当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。 《 IO - 同步,异步,阻塞,非阻塞 》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的...
  • fuyuehua22
  • fuyuehua22
  • 2014年07月30日 17:58
  • 2091

孙鑫MFC笔记之十四--多线程同步与异步套接字编程

多线程同步编程方法1 事件对象 n事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状...
  • App_12062011
  • App_12062011
  • 2012年06月26日 09:00
  • 3410

异步套接字实现

TCP 异步套接字,UDP异步套接字封装和使用 1.tcp为有连接的套接字,客户端套接字断开连接的时候服务端会自动断开接受,但服务端断开连接客户端接受线程一直运行,暂没办法解决。 2.tcp套接字可重...
  • wszde2
  • wszde2
  • 2016年01月28日 17:15
  • 317

使用异步套接字模式进行Windows网络编程

文章转摘自互联网。 使用异步套接字模式进行Windows网络编程 上面我们使用多线程技术解决了阻塞套接字模式的阻塞问题。微软提供了另外一种不使用多线程技术解决阻塞问题的方法,即异步套接字模式。 ...
  • u011384468
  • u011384468
  • 2013年07月12日 13:54
  • 1067
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于事件的异步套接字
举报原因:
原因补充:

(最多只允许输入30个字)