博文

在c#中利用keep-alive处理socket网络异常断开的方法(2008-10-08 16:52:00)

摘要:本文摘自 http://www.z6688.com/info/57987-1.htm   最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接。服务端采用C#开发,客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得,现在写出来和大家分享一下。 那网络异常断开原因主要有那些呢?归纳起来主要有以下两种: 1、客户端程序异常。   对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常)。只要在服务端处理这个异常就可以了。 2、网络链路异常。   如:网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的,我在这里贴出MSDN的原文: 如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。   但是我在实际应用中发现,MSDN说的这种处理方法在很多时候根本无效,无法检测出网络已经异常断开了。那我们该怎么办呢?   我们知道,TCP有一个连接检测机制,就是如果在指定的时间内(一般为2个小时)没有数据传送,会给对端发送一个Keep-Alive数据报,使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号,对端如果收到这个数据,回送一个TCP的ACK,确认这个字节已经收到,这样就知道此连接没有被断开。如果一段时间没有收到对方的响应,会进行重试,重试几次后,向对端发一个reset,然后将连接断掉。   在Windows中,第一次探测是在最后一次数据发送的两个小时,然后每隔1秒探测一次,一共探测5次,如果5次都没有收到回应的话,就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。那么我们该如何做呢?我要利用Socket类的IOControl()函数。我们来看看这个函数能干些什么: 使用 IOControlCode 枚举指定控制代码,为 Socket 设置低级操作模式。 命名空间:Syste......

阅读全文(5637) | 评论:1

MSSQL占用内存过大的解决方法(2008-10-08 16:47:00)

摘要:本文摘自: http://www.cnblogs.com/tomcat112906/archive/2008/09/29/1301842.html 经常使用mssql(WINDOWS平台上强大的数据库平台)的朋友都会发现一个小小的网站在运行若干天后mssql(WINDOWS平台上强大的数据库平台)就会把服务器上所有的内存都吃光,此时你不得不重新启动一下服务器或mssql(WINDOWS平台上强大的数据库平台)来释放内存,有人认为是mssql(WINDOWS平台上强大的数据库平台)有内存泄露问题,其实不然,微软给我们了明确说明:
Quote:
概要
  在您启动 sql server(WINDOWS平台上强大的数据库平台) 之后,sql server(WINDOWS平台上强大的数据库平台) 内存使用量将会持续稳定上升,即使当服务器上活动很少时也不会下降。另外,任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降,直到可用内存降到 4 至 10 MB 为止。   仅仅出现这种状态不表示内存泄漏。此行为是正常的,并且是 sql server(WINDOWS平台上强大的数据库平台) 缓冲池的预期行为。   默认情况下,sql server(WINDOWS平台上强大的数据库平台) 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),sql server(WINDOWS平台上强大的数据库平台) 缓冲池就会继续增大。像在与 sql server(WINDOWS平台上强大的数据库平台) 分配内存位于相同计算机上的其他进程一样,sql server(WINDOWS平台上强大的数据库平台) 缓冲区管理器将在需要的时候释放内存。sql server(WINDOWS平台上强大的数据库平台) 每秒可以释放和获取几兆字节的内存,从而使它可以快速适应内存分配变化。
更多信息
  您可以通过服务器内存最小值和服务器内存最大值配置选项设置 sql server(WINDOWS平台上强大的数据库平台) 数据库引擎使用的内存(缓冲池)量的上下限。在设置服务器内存最小值和服务器内存最大值选项之前,请查阅以下 Microsoft 知识库文章中标题为'内存'一节中的参考信......

阅读全文(5633) | 评论:0

(转)在IIS7下配置ASP.NET v1.1 (VS2003)(2008-07-08 19:48:00)

摘要:文章转自http://www.cublog.cn/u/884/showart.php?id=261667   原文地址:http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx   如果你不大熟悉 IIS 7.0 的配置, 要想让 ASP.NET 1.1 在 IIS 7.0 上正常运行应该是很难的. 安装VS.NET2003时你将会得到以下的一些错误: Microsoft Development Environment
Error while trying to run project: Unable to start debugging on the web server. Could not start ASP.NET or ATL Server debugging.
Verify that ASP.NET or ATL Server is correctly installed on the server.
Microsoft Developement Environment
Error while trying to run project: Unable to start debugging on the web server. You do not have permissions to debug the server.
Verify that you are a member of the "Debugger Users" group on the server.
ASP.NET Version Mismatch
Visual Studio .NET has detected that the Web server is running ASP.NET version 1.0. The Web application you are creating or opening can be configured......

阅读全文(6185) | 评论:0

2种通过经纬度坐标计算距离的方法(2007-10-31 11:26:00)

摘要:2种方法都是在网上搜索来的,一种原来是java写的,一种是.net写的,java的那个我翻译成.net的了. 1:原JAVA double distanceByLnglat(double _Longitude1,
   double _Latidute1,
   double _Longitude2,
   double _Latidute2)
  {
   
   double radLat1 = _Latidute1 * Math.PI / 180;
   double radLat2 = _Latidute2 * Math.PI / 180;
   double a = radLat1 - radLat2;
   double b = _Longitude1 * Math.PI / 180 - _Longitude2 * Math.PI / 180;
   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
   s = s * 6378137.0;// 取WGS84标准参考椭球中的地球长半径(单位:m)
   s = Math.Round(s * 10000) / 10000;    return s;
  }      2:原.Net public struct EarthPoint
  {
   public const double Ea = 6378137;......

阅读全文(9782) | 评论:2

获取数据库所有存储过程名称,内容以及参数的语句(2007-10-25 11:55:00)

摘要:SELECT (CASE WHEN b.colorder = 1 OR
      b.colorder IS NULL THEN a.name ELSE '' END) AS N'表名', b.name AS N'字段名',
      C.NAME AS N'数据类型', b.prec AS N'长度',
      (CASE WHEN b.colstat = 4 THEN '√' ELSE '' END) N'是否输出',
      b.colorder N'字段序号', (CASE WHEN b.colorder = 1 OR
      b.colorder IS NULL THEN d .text ELSE '' END) AS N'内容'
FROM sysobjects a LEFT JOIN
      syscolumns b ON b.id = a.id LEFT JOIN
      systypes C ON (C.xtype = B.xtype AND c.name <> 'sysname') LEFT JOIN
      syscomments d ON d .id = a.id
WHERE a.schema_ver = 0 AND a.xtype = 'p'
ORDER BY a.name, b.colorder......

阅读全文(3419) | 评论:0

如何获取SQL表字段的注释文本(2007-05-29 22:08:00)

摘要:SQL2000: SELECT B.name as 字段名,A.[value] as 注释
FROM sysproperties A INNER JOIN
      syscolumns B ON b.colid = A.smallid AND A.id = B.id
WHERE (B.id = OBJECT_ID('表名称')) SQL2005: select * from fn_listextendedproperty('MS_Description',   'user',   'dbo',   'table',   '表名称'',   'column',   default)
注:次方法只能取出有注释的字段,如果指定表没有注释,则此方法不能获取到任何记录......

阅读全文(3847) | 评论:0

浅析:setsockopt()改善socket网络程序的健壮性[转](2007-04-24 16:50:00)

摘要:1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程 )后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,S......

阅读全文(3554) | 评论:0

怎样用Shell调用sql执行sql脚本文件(2007-04-13 11:26:00)

摘要:string sqlQuery = "osql.exe /uSQLLogUser /pPasswrod /sServerName /dDataBaseName /i yoursql.sql";
......

阅读全文(4675) | 评论:0

安装SQL2000报“挂起的文件操作” (2007-04-04 22:47:00)

摘要: 如果在安装SQL Server之前装过其他软件,常常报:
“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。”
即使重启N次也不行,解决方法:
开始》运行》regedt32
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager,
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager这三个项中的PendingFileRenameOperations值,删除即可。 ......

阅读全文(3821) | 评论:0

关于“automation服务器不能创建对象”的问题的解决方案大全(2007-03-12 09:19:00)

摘要:automation服务器不能创建对象”的问题的解决方案大全   文章引用至: http://e.simwe.com/html/v/b/c/viewspace_2916.html

本人工作中的应用系统都是jsp的,大量javascript程序,一旦出“automation服务器不能创建对象”问题,大量报表及查询无法保存,苦思冥

想、千尝万试,终于将其搞定,现将相关方案与大家共享。
1、如果是Scripting.FileSystemObject (FSO 文本文件读写)被关闭了,开启FSO功能即可,在“运行”中执行regsvr32 scrrun.dll即可

2、安全模式设置成“中”,如果javascript脚本中报这个错误,还应将IE的安全设置“不允许运行未标记为安全的activeX控件”启用即可。

注意如果您将相应的网站设成“受信任的站点”,必须对“受信任的站点”进行相应的IE安全设置,此时如果对“Internet”IE设置将是徒劳

的。

3、有些脚本需要微软的 MSXML 控件才能进入。当使用 IE 5 以上版本的缺省安全模式时,会提示是否接受 MSXML 控件,如果接受,MSXML 将

自动安装到您的机器上(得等上几分钟)。如果自动安装不成功,可以自行下载和安装 MSXML 3.0 SP7。有时是由于msxml 3服务被关掉了,使用

regsvr32 msxml3.dll即可

4、用上面方法基本上能决问题。如果是在安装某个软件后出现这种问题,可尝度卸载该软件或重装一下!
如果还是不行,试试以下方法: 5、请将以下语句复制到记事本中,另存为后缀为.cmd的文件,并运行。当然在命令行下一句句运行也没问题。

echo 正在修复,这个过程可能需要几分钟,请稍候……
rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%/System32/dacui.dll
rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%/Catroot/icatalog.mdb ......

阅读全文(24139) | 评论:0