为何频繁手动请求socket时候会抛出的异常

飞起来一脚 2012-05-16 04:04:25
如题
服务器端接受请求,然后返回给客户端
客户端有两种请求方式,一种手动,一种自动:
手动发送频率很快的话,服务器端Receive()的时候会抛出SocketException异常:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
按道理来说,如果自动循环发送请求,更应该抛出异常,但是恰恰相反,顺利通过了,不理解,贴代码大家找找原因

服务器
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace testSimpleSocket
{
class Program
{
static void Main(string[] args)
{

var ipa = IPAddress.Parse("192.168.1.100");
var endpoint = new IPEndPoint(ipa,10000);
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(endpoint);
socket.Listen(50);

while (true)
{
using (var acceptSocket = socket.Accept())
{
acceptSocket.ReceiveTimeout = 2;
if (acceptSocket.Connected)
{
var buffer = new byte[64];
//try 加上处理能通过,但是造成异常的原因不明白
//{
acceptSocket.Receive(buffer, buffer.Length, 0);
//}
//catch (SocketException e)
//{
// continue;
//}

var str = ByteToString(buffer);
Console.WriteLine("收到:" + str);
acceptSocket.Send(StringToByte("A"));
}
}
}
}

public static string ByteToString(byte[] buffer)
{
return Encoding.BigEndianUnicode.GetString(buffer);
}
public static byte[] StringToByte(string str)
{
return Encoding.BigEndianUnicode.GetBytes(str.ToCharArray());
}
}
}


客户端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Socket客户端
{
class Program
{
private static Socket socket;
static void Main(string[] args)
{
Console.WriteLine("模拟客户端");
while (true) //按快点就抛....
{
var msg = Console.ReadLine();
if (msg.ToLower() == "exit") return;
Send(msg);
}
int i = 0; //这个反而不抛
while (i++<10)
{
Send(i.ToString());
}
Console.ReadKey();
}

static void Send(string msg)
{
IPAddress hostIP = IPAddress.Parse("192.168.1.100");
IPEndPoint point;
try
{
point = new IPEndPoint(hostIP, 10000);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(point);
//send ...
var sendByte = new byte[64];
sendByte = Encoding.BigEndianUnicode.GetBytes(msg.ToCharArray());
var i=socket.Send(sendByte, sendByte.Length, 0);
Console.WriteLine(i);

var bytes = new byte[64];
socket.Receive(bytes, bytes.Length, 0);
var str = Encoding.BigEndianUnicode.GetString(bytes);
var t = str;
Console.WriteLine("result:"+t);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}


补充,客户端发送改成这样居然也能通过
var msg = Console.ReadKey();
Send(msg.Key.ToString().ToLower());
...全文
132 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞起来一脚 2012-05-17
  • 打赏
  • 举报
回复
以上代码可直接运行,有兴趣的朋友一起研究下

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧