原文網址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 語言編寫的TCP/UDP通信框架 作者是英國人 以前是收費的 目前作者已經開源 開源地址是:https://github.com/MarcFletcher/NetworkComms.Net 使 ...
原文網址: http://www.cnblogs.com/csdev
Networkcomms 是一款C# 語言編寫的TCP/UDP通信框架 作者是英國人 以前是收費的 目前作者已經開源 開源地址是:https://github.com/MarcFletcher/NetworkComms.Net
使用networkcomms框架通信時,客戶端發送消息,伺服器端回覆消息。
確保收到的消息,是用戶發來的,而不是惡意消息,可以在networkcomms框架中加入首位元組驗證機制。
思路是這樣的:
如果伺服器端收到的消息是 登錄消息,則進行處理,如果登陸成功,則首位元組驗證成功,伺服器可以處理當前連接上後續的消息。
如果伺服器沒有收到登錄消息,只是收到了其他類型的消息,則不進行處理。
這樣可以確保收到的消息,都是登錄用戶發來的,確保了通信安全。
networkcomms框架本身沒有這個機制,我們來加入這個機制。
第一步: 在 ConnectionInfo類中加入FirstVerify成員
public bool FirstVerify { get; set; }
第二步,在Networkcomms類中,加入FirstVerify 成員
public static bool FirstVerify { get; set; }
第三步,修改ReservedPacketType枚舉類型
這個類型是通信框架內置的消息類型,屬於保留消息類型,這個類型的數據被處理的優先順序很高。
enum ReservedPacketType { Confirmation, CheckSumFailResend, AliveTestPacket, ConnectionSetup, Unmanaged, NestedPacket, UserLogin, }
UserLogin是我們的登錄類型。
第四步:修改ConnectionIncomingData.cs文件中相關方法 紅色部分是新加入的
//如果是內部類型,直接進行處理
if (isReservedPacketType) { #if WINDOWS_PHONE || NETFX_CORE QueueItemPriority priority = QueueItemPriority.Normal; #else QueueItemPriority priority = (QueueItemPriority)Thread.CurrentThread.Priority; #endif PriorityQueueItem item = new PriorityQueueItem(priority, this, topPacketHeader, packetBuilder.ReadDataSection(packetHeaderSize, topPacketHeader.TotalPayloadSize), incomingPacketSendReceiveOptions); if (NetworkComms.LoggingEnabled) NetworkComms.Logger.Trace(" ... handling packet type '" + topPacketHeader.PacketType + "' inline. Loop index - " + loopCounter.ToString() + packetSeqNumStr); NetworkComms.CompleteIncomingItemTask(item); } else { //如果需要驗證並且驗證通過 或者不需要驗證 進行處理 if ((NetworkComms.FirstVerify == true && this.ConnectionInfo.FirstVerify == true)||NetworkComms.FirstVerify==false) {
客戶端登錄代碼:
大致如下 UserLogin是登錄的消息類型
userLoginContract是自定義的類 可以根據實際情況進行定義
UserLoginContract loginContract = newTcpConnection.SendReceiveObject<UserInfo, UserLoginContract>("UserLogin", "ResUserLogin", 5000, userInfo);
伺服器端:
NetworkComms.FirstVerify = true;
這句的意思是,啟用首位元組驗證,如果設定為false,則不進行首位元組驗證。
在處理登錄的方法中
//處理用戶登錄<4>
private void IncomingLoginHandler(PacketHeader header, Connection connection, UserInfo userInfo)
{
//驗證用戶登錄
如果登錄成功
設定首位元組驗證成功
connection.ConnectionInfo.FirstVerify = true;
}
原文網址: http://www.cnblogs.com/csdev