msdn里面对Socket.Send所引发的SocketException没有做任何进一步的说明。按照VC6的惯例,只要有字节被发送,则Send不会返回-1。如果照此逻辑,则在C#里面只有当Socket.Send连一个字节也发不动的时候它才能产生SocketException。以上是我的猜想,应该是对的。但是该死的msdn为什么不做一下说明呢?也许我就猜错了。
解决方案 »
- base改怎么使用啊?
- HOW TO:播放內嵌在 Windows Form 資源中的音效?
- c#中连接数据库的问题
- .net2005自带的登录模块怎么用起来?
- 请进:关于表格的动态控件生成,来者又分
- 在winform中怎样在一个窗体中打开另一个窗体,并带过去几个参数?
- C#的基本开发环境是什么?
- vb中的ChDir()函数在C#中有什么表示方法??
- C# 窗体2 给 窗体 1 的textbox 赋值不了
- sqlConnection的连接字符串中sever是什么参数
- 数据库操作时,用数据组件设计时写好参数好,还是在程序动态生成组件并自己写SQL好呀。
- 如何创建表间关系(datarelation)
{
lock(this)
{
if(op == null)
{
return false;
} if(!op.socket.Connected)
{
return false;
} bool ret = false;
if(GetCanSend(op) > size)
{
Array.Copy(buf, offset, op.sendBuf, op.sendSize, size);
op.sendSize += size;
ret = true;
} try
{
int send = op.socket.Send(op.sendBuf, op.sendOffset, op.sendSize - op.sendOffset, SocketFlags.None);
op.sendOffset += send;
while(send > 0 && op.sendOffset < op.sendSize)
{
send = op.socket.Send(op.sendBuf, op.sendOffset, op.sendSize - op.sendOffset, SocketFlags.None);
op.sendOffset += send;
}
}
catch(SocketException se)
{
if(se.NativeErrorCode == 10035) //would block
{
return ret;
}
else
{
System.Diagnostics.Trace.WriteLine(se);
return false;
}
} if(op.sendOffset == op.sendSize)
{
op.sendOffset = 0;
op.sendSize = 0;
} return ret; } }
如果是UDP,UDP层不会负责这些重传等操作,所以重传的任务就由你的应用程序负责了,而且UDP层也会将出错的数据包丢弃掉。
所以我们应该重传整个数据包。