Socket开发异常总结
2010-12-17 16:08
204 查看
Socket异常开发总结
事情概况:今天早上手机充值业务突然停止,客户端又不断提交充值订单上来,短时间出现大量客户投诉,经检查,后在同事Aaron的帮助下,查找出问题原因
首先看一下充值系统架构,手机充值Win Service 会每稍钟从数据库里查询出一条没有提交充值的订单去充值。结构类图概要如下
代码
public class SocketHelp
{
#region 手机充值
public static string Submit(Order record, string productInfo)
{
try
{
IPAddress ip = IPAddress.Parse(Host);
IPEndPoint ipe = new IPEndPoint(ip, Port);
using (Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
clientSocket.ReceiveTimeout = SocketTimeout;
clientSocket.SendTimeout = SocketTimeout;
DFSubmitLog.Debug("Connecting......");
clientSocket.Connect(ipe);
byte[] bs = Encoding.UTF8.GetBytes(upOrderContent);
clientSocket.Send(bs, bs.Length, 0);
string recvStr = String.Empty;
byte[] recvBytes = new byte[1024];
Thread.Sleep(SocketTimeout);
int bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0);
recvStr = Encoding.UTF8.GetString(recvBytes, 0, bytes);
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
return recvStr;
}
}
catch (ArgumentNullException e)
{
return String.Empty;
}
catch (SocketException e)
{
return string.Empty ;
}
catch (Exception e)
{
return string.Empty;
}
}
}
指定了,发送数据时间,接收数据时间,超过这个时间了就引发socket异常
修改了程序以后,我把其中变量SocketTimeout设置成500,即500毫秒,由于这个时间还是不够长,在程序起动的时候会引发 :SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败
后来我把SocketTimeout设置成2000,即2秒钟就没有问题,程序可以正常运行
相关Socket类的MSND地址是:
http://msdn.microsoft.com/zh-cn/library/attbb8f5(v=VS.80).aspx
其中关于Socket类的几个属性资料摘录如下
1. 当数据发送和数据接收完成之后,可使用 Shutdown 方法来禁用 Socket。在调用 Shutdown 之后,可调用 Close 方法来释放与 Socket 关联的所有资源
2. Socket.SendTimeout 属性
获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。
命名空间:System.Net.Sockets属性值
超时值(以毫秒为单位)。如果将该属性设置为 1 到 499 之间的值,该值将被更改为 500。默认值为 0,指示超时期限无限大。指定 -1 还会指示超时期限无限大。
3 Socket.ReceiveTimeout 属性
获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。
命名空间:System.Net.Sockets
程序集:System(在 system.dll 中)
超时值(以毫秒为单位)。默认值为 0,指示超时期限无限大。指定 -1 还会指示超时期限无限大。
异常
--------------------------------------------------------------------------------
异常类型 条件
SocketException
试图访问套接字时发生错误。
ObjectDisposedException
Socket 已关闭。
ArgumentOutOfRangeException
为设置操作指定的值小于 -1。
--------------------------------------------------------------------------------
此选项仅适用于同步 Receive 调用。如果超过超时期限,Receive 方法将引发 SocketException。
其它参考文摘
http://blog.163.com/gfmq_312/blog/static/17823682200951711112373/
在通讯过程中,由于客户端是周期性地向服务器请求数据,若客户端的请求指令或是服务端发来的数据包丢失的话,那么客户端将一直等待,陷入假死状态。由于默认为无超时,所以一定要记得设定客户端接收的超时时间,若服务器端无相应,客户端应该抛出异常,而不是毫无意义的等待
事情概况:今天早上手机充值业务突然停止,客户端又不断提交充值订单上来,短时间出现大量客户投诉,经检查,后在同事Aaron的帮助下,查找出问题原因
首先看一下充值系统架构,手机充值Win Service 会每稍钟从数据库里查询出一条没有提交充值的订单去充值。结构类图概要如下
代码
public class SocketHelp
{
#region 手机充值
public static string Submit(Order record, string productInfo)
{
try
{
IPAddress ip = IPAddress.Parse(Host);
IPEndPoint ipe = new IPEndPoint(ip, Port);
using (Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
clientSocket.ReceiveTimeout = SocketTimeout;
clientSocket.SendTimeout = SocketTimeout;
DFSubmitLog.Debug("Connecting......");
clientSocket.Connect(ipe);
byte[] bs = Encoding.UTF8.GetBytes(upOrderContent);
clientSocket.Send(bs, bs.Length, 0);
string recvStr = String.Empty;
byte[] recvBytes = new byte[1024];
Thread.Sleep(SocketTimeout);
int bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0);
recvStr = Encoding.UTF8.GetString(recvBytes, 0, bytes);
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
return recvStr;
}
}
catch (ArgumentNullException e)
{
return String.Empty;
}
catch (SocketException e)
{
return string.Empty ;
}
catch (Exception e)
{
return string.Empty;
}
}
}
指定了,发送数据时间,接收数据时间,超过这个时间了就引发socket异常
修改了程序以后,我把其中变量SocketTimeout设置成500,即500毫秒,由于这个时间还是不够长,在程序起动的时候会引发 :SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败
后来我把SocketTimeout设置成2000,即2秒钟就没有问题,程序可以正常运行
相关Socket类的MSND地址是:
http://msdn.microsoft.com/zh-cn/library/attbb8f5(v=VS.80).aspx
其中关于Socket类的几个属性资料摘录如下
1. 当数据发送和数据接收完成之后,可使用 Shutdown 方法来禁用 Socket。在调用 Shutdown 之后,可调用 Close 方法来释放与 Socket 关联的所有资源
2. Socket.SendTimeout 属性
获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。
命名空间:System.Net.Sockets属性值
超时值(以毫秒为单位)。如果将该属性设置为 1 到 499 之间的值,该值将被更改为 500。默认值为 0,指示超时期限无限大。指定 -1 还会指示超时期限无限大。
3 Socket.ReceiveTimeout 属性
获取或设置一个值,该值指定之后同步 Receive 调用将超时的时间长度。
命名空间:System.Net.Sockets
程序集:System(在 system.dll 中)
超时值(以毫秒为单位)。默认值为 0,指示超时期限无限大。指定 -1 还会指示超时期限无限大。
异常
--------------------------------------------------------------------------------
异常类型 条件
SocketException
试图访问套接字时发生错误。
ObjectDisposedException
Socket 已关闭。
ArgumentOutOfRangeException
为设置操作指定的值小于 -1。
--------------------------------------------------------------------------------
此选项仅适用于同步 Receive 调用。如果超过超时期限,Receive 方法将引发 SocketException。
其它参考文摘
http://blog.163.com/gfmq_312/blog/static/17823682200951711112373/
在通讯过程中,由于客户端是周期性地向服务器请求数据,若客户端的请求指令或是服务端发来的数据包丢失的话,那么客户端将一直等待,陷入假死状态。由于默认为无超时,所以一定要记得设定客户端接收的超时时间,若服务器端无相应,客户端应该抛出异常,而不是毫无意义的等待
相关文章推荐
- Android App开发之ANR异常的原因分析及处理总结
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)
- Android关于网络访问app应用开发相关的异常总结
- Eclipse插件开发中遇到的一些异常总结
- Android异常总结--- java.net.SocketTimeoutException: Transport endpoint is not connected
- asp.net开发中常见公共捕获异常方式总结(附源码)
- android开发中遇到的异常总结
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
- asp.net开发中常见公共捕获异常方式总结(附源码)
- 开发中的异常和错误总结
- Android异常总结--- java.net.SocketTimeoutException: Transport endpoint is not connected
- iOS开发异常错误总结之——wait_fences: failed to receive reply: 10004003
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯
- java socket异常总结
- android开发异常总结(好记性不如烂博客)
- linux下socket通信代码的开发及总结---UDP
- 使用oracle数据库开发,异常总结
- iOS开发异常错误总结
- 【IOS 开发学习总结-OC-22】★objective-c——使用@try 处理异常
- android开发异常总结