C# SOCKET异步,Wineows服务 ,服务

问题描述

用Windows服务写的一个Socket异步服务器,用来解析和处理客户端上传的数据,客户端有100多个吧,刚开始运行正常,几个小时后,服务还在运行,但不能解析客户端的数据了,而且客户端也连不上了,重新了一下服务,又好了,求高手解决,主要代码如下:privateManualResetEventallDone=newManualResetEvent(false);//启动服务方法publicvoidInitRfidServer(){try{//实例化套接字(ip4寻址协议,流式传输,TCP协议)rifdServerSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建网络节点对象包含ip和portIPEndPointendpoint=newIPEndPoint(IPAddress.Parse(rfidIP),rfidPort);//将监听套接字绑定到对应的IP和端口rifdServerSocket.Bind(endpoint);//设置监听队列长度为300(同时能够处理300个连接请求)rifdServerSocket.Listen(300);rifdServerSocket.IOControl(IOControlCode.KeepAliveValues,keepAlive(1,1000,1000),null);}catch(Exceptionex){Common.WriteLogFile("SOCKET",3,"InitRfidServer():"+ex.Message);return;}rfidServerThread=newThread(StartWatch);rfidServerThread.IsBackground=true;rfidServerThread.Start();}//监听privatevoidStartWatch(){try{while(isWatch){allDone.Reset();rifdServerSocket.BeginAccept(newAsyncCallback(AcceptCallBack),rifdServerSocket);allDone.WaitOne();}rifdServerSocket.Close();}catch(Exceptionex){Common.WriteLogFile("SOCKET",3,"StartWatch():"+ex.Message);}}publicconstint_bufferSize=1024;classStateObject{publicSocketworkSocket=null;publicbyte[]buffer=newbyte[_bufferSize];}//接收到客户端连接privatevoidAcceptCallBack(IAsyncResultar){allDone.Set();Socketlistener=(Socket)ar.AsyncState;if(listener!=null){Sockethandler=listener.EndAccept(ar);StateObjectstate=newStateObject();state.workSocket=handler;ConnectionClientconnection=newConnectionClient(handler);//将负责与当前连接请求客户端通信的套接字所在的连接通信类对象装入集合lock(obj){if(!dictConn.Keys.Contains(handler.RemoteEndPoint.ToString())){RequestInfoMessage("SOCKET",0,"建立连接"+handler.RemoteEndPoint.ToString());dictConn.Add(handler.RemoteEndPoint.ToString(),connection);stringremoteIP=(handler.RemoteEndPointasIPEndPoint).Address.ToString();DbHelperSQL.connectionString=PubConstant.LocalConString;DbHelperSQL.RunProcedure("proc_UpdateConStatus",newSqlParameter[3]{newSqlParameter("ip",remoteIP),newSqlParameter("status",1),newSqlParameter("mytime",DateTime.Now)});if(dicRfidIPSnapIP.ContainsKey(remoteIP))//每次检漏3重新连接时让摄像机重新登录,因为断电上电后,摄像机需要重新登录{SnapReLogin(dicRfidIPSnapIP[remoteIP]);}}else{RequestInfoMessage("SOCKET",0,string.Format("dictConn已经包含{0}的连接了",handler.RemoteEndPoint.ToString()));Common.WriteLogFile("SOCKET",3,string.Format("dictConn已经包含{0}的连接了",handler.RemoteEndPoint.ToString()));}}handler.BeginReceive(state.buffer,0,_bufferSize,0,newAsyncCallback(readCallBack),state);}}///<summary>///异步接收客户端发送来的信息///</summary>///<paramname="ar"></param>privatevoidreadCallBack(IAsyncResultar){stringremotePoint=string.Empty;StateObjectstate=null;byte[]receiveBuff;Sockethandler=null;try{state=(StateObject)ar.AsyncState;handler=state.workSocket;remotePoint=handler.RemoteEndPoint.ToString();if(handler.Connected){intread=handler.EndReceive(ar);if(read>0)lock(obj){receiveBuff=state.buffer;RecMsg(receiveBuff,handler.RemoteEndPoint,read);//}}else{RemoveClientConnection(remotePoint);return;}ar.AsyncWaitHandle.Close();//清空数据,重新开始异步接收receiveBuff=newbyte[_bufferSize];handler.BeginReceive(state.buffer,0,_bufferSize,0,newAsyncCallback(readCallBack),state);}else{RemoveClientConnection(remotePoint);}}catch(Exceptionex){Common.WriteLogFile("SOCKET",3,"readCallBack():"+ex.Message);RemoveClientConnection(remotePoint);}}privatebyte[]keepAlive(intonOff,intkeepAliveTime,intkeepAliveInterval){byte[]buffer=newbyte[12];BitConverter.GetBytes(onOff).CopyTo(buffer,0);BitConverter.GetBytes(keepAliveTime).CopyTo(buffer,4);BitConverter.GetBytes(keepAliveInterval).CopyTo(buffer,8);returnbuffer;}

解决方案

解决方案二:
所以while的代码我觉得应该不完全属于"异步",其次所谓的异步里面应该也看不到thread之类的代码.而且allDone这是什么东西,反正我写代码从来没用过照样能连接很多"客户端"..
解决方案三:
那个While是监听客户端连接的,没有的话,只能连接一个客户端吧?allDone是线程的控制信号

时间: 2024-10-10 16:46:30

C# SOCKET异步,Wineows服务 ,服务的相关文章

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

异步调用Web服务

web|web服务|异步 //////////////////////////////////////////////////////////////////////////////////Author: stardicky ////E-mail: stardicky@hotmail.com ////QQNumber: 9531511 ////CompanyName: Ezone International ////Class: HBS-0308 ////title: 异步调用Web服务 ///

java socket手机通信-关于java的问题:手机用socket连接电脑的服务端时老出现文件找不到的错误,求解决

问题描述 关于java的问题:手机用socket连接电脑的服务端时老出现文件找不到的错误,求解决 30C 解决方案 也可以私聊我.扣扣1944687725 解决方案二: 解决方案三: 你那个斜杠是不是写反了 passwdinput.dat 解决方案四: 你仔细看看出错的提示, 是读文件的时候找不到,对应的代码是在ServerThread.java的51行然后,你把路径改为绝对路径试一试,如果可以了,就是你相对路径的根目录不对.保证passwd文件夹在你的执行目录下 解决方案五: 右键 prope

.net的socket异步通讯示例分享

 这篇文章主要介绍了.net的socket异步通讯示例,操作在下面,需要的朋友可以参考下 1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client   2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件    代码如下: using System.Net; using System.Net.Sockets;     3.FormLoad方法添加代码    代码如下: private void Form1_Load(object sender,

TCP通信socket异步,客户端报异常:目标主机积极拒绝

问题描述 TCP通信socket异步,客户端报异常:目标主机积极拒绝 服务端只监听时,客户端建立1500个连接请求都可以正常建立连接,但当服务端改成建立连接后触发一个事件给客户端发送数据时,客户端异常:目标主机积极拒绝,只能建立部分连接.是何原因,希望有老师可以指点一下.不胜感激!! 解决方案 Socket(Tcp)通信客户端 解决方案二: 客户端接收的数据是否正确处理,然后就是看一下你服务器发送数据给客户端后,是不是关闭了连接

.net的socket异步通讯示例分享_实用技巧

1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件 复制代码 代码如下: using System.Net;using System.Net.Sockets; 3.FormLoad方法添加代码 复制代码 代码如下: private void Form1_Load(object sender, EventArgs e)        {            IPEndPoint epS

java nio socket 异步接收数据

问题描述 nio socket 异步接收数据,如何确定收接的数据,就是发送的返回的?有谁研究过没. 问题补充:如果不用id,nio客户端是否可以同步接收数据呢?是把socketChannel.configureBlocking(true)吗? 解决方案 在消息中增加UUID,在调用端记录UUID,并将UUID和消息一起发送到服务端,服务端的回传消息附件上UUID,调用端根据收到的消息包含的UUID确定给哪个调用者.解决方案二:异步调用的常见问题.因为没有办法实施返回,只有打标志了.要你把通信协议

web service-axis2 调用 tuxedo服务 服务端返回的错误报文接口不到(正确的报文可以正常接收)???

问题描述 axis2 调用 tuxedo服务 服务端返回的错误报文接口不到(正确的报文可以正常接收)??? public String invoke(OMElement head,OMElement body,String methodName,String routedestsys, String wsdl) { String returnXml=""; try { Options options = new Options(); // 指定调用WebService的URL Endp