C#中Socket.Receive 方法 (Byte[], Int32, SocketFlags)的SocketFlags的含义

2 篇文章 0 订阅
2 篇文章 0 订阅

查看MSDN:http://msdn.microsoft.com/zh-cn/library/26f591ax(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 该消息太大,无法放入指定的缓冲区,因而被截断。


因为我得知SocketFlags是enum类型的,所以想当然认为第0个就是指上表中的第一个:Broadcast。

所以为了代码的可理解性,我把

<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

真够折腾的!


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值