C#中Socket.Receive 方法 (Byte[], Int32, SocketFlags)的SocketFlags的含义
2014-06-03 14:21
417 查看
查看MSDN:http://msdn.microsoft.com/zh-cn/library/26f591ax(v=vs.110).aspx 他给的例子中是这样写的:
SocketFlags参数为0,网上很多其他代码也是写了0,但是我一直不知道为什么是0, 0代表什么意思,所以就顺着页面找到了http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketflags(v=vs.110).aspx 这个链接是讲SocketFlags的。他列了一堆的参数:
因为我得知SocketFlags是enum类型的,所以想当然认为第0个就是指上表中的第一个:Broadcast。
所以为了代码的可理解性,我把
改成了:
精疲力尽之后,我重新审视SocketFlags的具体含义,为什么别人用0是正确的,用SocketFlags.Broadcast就错呢,说明他们不是同一个东西,于是发现SocketFlags此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
于是我就去查FlagsAttribute属性,上面终于说了0是指None的意思。所以再次为了代码的可读性,我把
改成了:
运行正常。
感兴趣的同学可以去看FlagsAttribute的具体计算方法:http://msdn.microsoft.com/zh-cn/library/system.flagsattribute(v=vs.110).aspx
真够折腾的!
<span style="font-size:18px;">bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);</span>
SocketFlags参数为0,网上很多其他代码也是写了0,但是我一直不知道为什么是0, 0代表什么意思,所以就顺着页面找到了http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketflags(v=vs.110).aspx 这个链接是讲SocketFlags的。他列了一堆的参数:
成员名称 | 说明 | |
---|---|---|
Broadcast | 指示广播数据包。 | |
ControlDataTruncated | 指示控件数据不适合内部 64-KB 缓冲区,并且已被截断。 | |
DontRoute | 不使用路由表发送。 | |
MaxIOVectorLength | 为发送和接收数据的 WSABUF 结构数量提供标准值。 .NET Framework 4.5 上将不使用或不支持此值。 | |
Multicast | 指示多路广播数据包。 | |
None | 不对此调用使用标志。 | |
OutOfBand | 处理带外数据。 | |
Partial | 消息的部分发送或接收。 | |
Peek | 查看传入的消息。 | |
Truncated | 该消息太大,无法放入指定的缓冲区,因而被截断。 |
所以为了代码的可理解性,我把
<pre name="code" class="csharp"><span style="font-size:18px;">bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);</span>
改成了:
<span style="font-size:18px;">bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.Broadcast);</span>运行之后给我抛出SocketException异常,我强迫症又捣腾这个异常的error_code。
精疲力尽之后,我重新审视SocketFlags的具体含义,为什么别人用0是正确的,用SocketFlags.Broadcast就错呢,说明他们不是同一个东西,于是发现SocketFlags此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
于是我就去查FlagsAttribute属性,上面终于说了0是指None的意思。所以再次为了代码的可读性,我把
<span style="font-size:18px;">bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);</span>
改成了:
<span style="font-size:18px;">bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);</span>
运行正常。
感兴趣的同学可以去看FlagsAttribute的具体计算方法:http://msdn.microsoft.com/zh-cn/library/system.flagsattribute(v=vs.110).aspx
真够折腾的!
相关文章推荐
- C# Socket 使用send,Receive方法请人指导下..
- C# socket receive byte[] 转成string 有空白字符
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- C#中判断socket是否已断开的方法
- C#托管Socket的实现方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- C#下Socket对象的BeginReceive方法,执行后竟然不调用AsyncCallback里的回调函数
- c# 扩展方法奇思妙用基础篇三:byte 常用扩展
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- C#托管Socket的实现方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- SByte.TryParse 方法 (String, SByte)的C#例子
- C#托管Socket的实现方法(一)
- C#托管Socket的实现方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
- C#托管Socket的实现方法
- C#中string转换成字节byte的处理方法