查看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
真夠折騰的!