基于事件的异步套接字

原创 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;
			}
		}




相关文章推荐

TCP流式套接字的异步事件WSAAsyncSelect编程

WSAAsyncSelect( )是Winsock提供的一个适合于Windows编程使用的函数,它允许在一个套接口上当发生特定的网络事件时,给Windows网络应用程序(窗口或对话框)发送一个消息(事...
  • qqMCY
  • qqMCY
  • 2013年06月30日 19:45
  • 1088

异步套接字聊天室程序实现

  • 2008年04月18日 17:56
  • 2.67MB
  • 下载

异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

select函数:        系统提供select函数来实现多路复用输入/输出模型。原型:        #include sys/time.h>        #include unistd.h...

Boost异步套接字client

代码来自:Boost#include #include #include #include #include #includ

Windows异步套接字网络编程

  • 2009年05月22日 16:23
  • 119KB
  • 下载

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

当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。 《 IO - 同步,异步,阻塞,非阻塞 》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于事件的异步套接字
举报原因:
原因补充:

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