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

查看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

真夠折騰的!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章