📘 C# Blog Series – Blog 49 **“C# TCP Packet Splitting & Reassembly — जब GPS Packets टूटकर आते हैं तो उन्हें कैसे Handle करें?

📘 C# Blog Series – Blog 49

**“C# TCP Packet Splitting & Reassembly — जब GPS Packets टूटकर आते हैं तो उन्हें कैसे Handle करें?




(Real-Life Example: G17 / S15 Devices के Half Packets, Merged Packets, Multiple Packets)”**

GPS TCP Servers में सबसे बड़ा Actual Real-World Problem क्या है?

👉 Packets टूटकर आते हैं (Split Packets)
👉 Packets जुड़कर आते हैं (Merged Packets / Sticky Packets)
👉 एक बार में कई packets मिल जाते हैं (Multi Packet Frame)

TCP stream-based है, message-based नहीं।
इसलिए device का भेजा हुआ packet server पर एक बार में नहीं पहुँचता।

Server को intelligently packet reassembly करना पड़ता है।

यह blog आपके GPS server को 100% production-ready बनाता है।


🟦 1. TCP Stream Problem — MUST KNOW

TCP आपको data ऐसे भेजता है:

[Chunk1][Chunk2][Chunk3]...[ChunkN]

लेकिन आपको packets चाहिए इस format में:

Packet1 Packet2 Packet3

यह possible है:

❌ Half packet:

imei:8611280 68064267,lat: 26.85,l...

❌ Multiple packets merged:

imei:861...,A;imei:861...,A;imei:861...,A;

❌ Random breaks:

im ei:8611 2806...

GPS server बनाने वालों की सबसे बड़ी गलती:
Chunk = Packet समझ लेना।


🟢 2. Correct Approach: Buffer + Pattern Detection

आपको एक string buffer बनाना है:

StringBuilder buffer = new StringBuilder();

हर read के बाद chunk जोड़ दो:

buffer.Append(receivedChunk);

अब buffer में पूरे data पर packet pattern search करेंगे।


3. GPS Packet End Marker

अधिकतर GPS packets इस pattern पर खत्म होते हैं:

; (semicolon)

जैसे:

imei:861...,lat...,lon...,speed...,bat...;

So packet end = ;


🌟 4. Full Code: Split & Merge दोनों handle करना

StringBuilder buffer = new StringBuilder(); while(true) { int bytes = await stream.ReadAsync(data, 0, data.Length); if(bytes == 0) break; string chunk = Encoding.ASCII.GetString(data, 0, bytes); buffer.Append(chunk); string all = buffer.ToString(); int index; while((index = all.IndexOf(';')) != -1) { string packet = all.Substring(0, index + 1); ProcessPacket(packet); // <-- Perfect packet all = all.Substring(index + 1); } buffer.Clear(); buffer.Append(all); }

This code handles:

✔ split packets
✔ merged packets
✔ multi packets
✔ random chunking
✔ continuous TCP stream

Production-grade logic 🔥


🟠 5. Real Example of Merged Packets

Incoming from device:

imei:8611...,A;imei:8612...,A;imei:8613...,A;

Our loop automatically extracts:

Packet1 Packet2 Packet3

🔵 6. Real Example of Half Packets

Chunk1:

imei:861128

Chunk2:

068064267,A;

Buffer collects:

imei:861128068064267,A;

Our loop extracts 1 perfect packet.


🟣 7. What About Devices With Custom End Markers?

Some GPS models use:

  • \r\n

  • $

  • *

  • <END>

  • ##END##

आपको बस उस marker को detect करना है:

Example:

all.IndexOf("\r\n")

🔥 8. Regex-based Packet Extraction (Super Clean Method)

var matches = Regex.Matches(all, @"imei:.*?;"); foreach(Match m in matches) { ProcessPacket(m.Value); }

Then leftover save to buffer.


🧠 9. Why 99% Developers Make Mistake?

They do:

string packet = Encoding.ASCII.GetString(data); ProcessPacket(packet);

लेकिन यह हमेशा wrong होता है क्योंकि:

  • data पूरा packet नहीं होता

  • data कई packets हो सकते हैं

  • data बीच से कट सकता है

TCP = continuous stream, not packeted stream.


📌 10. Thread Safety Note

Buffer को हर client के लिए अलग रखना चाहिए:

ClientConnection { public StringBuilder Buffer { get; set; } }

Never use global buffer!


⚠ Common Mistakes (Avoid Them)**

❌ Chunk को ही packet मान लेना
❌ Buffer clear करना भूलना
❌ Index calculation गलत करना
❌ Recursive substring से performance drop
✔ Use StringBuilder
✔ Use while loop for extraction
✔ Use correct end marker


🔚 Conclusion

Packet splitting & reassembly आपके GPS server को बनाता है:

✔ 100% reliable
✔ No packet loss
✔ No corruption
✔ High-performance
✔ Production-ready
✔ Accurate parsing

अगर आपने यह logic सही implement कर लिया →
आपका TCP GPS server industry-level बन जाएगा।

Post a Comment

0 Comments

Translate

Close Menu