Forum

C# - Socket - Netwo...
 
Bildirimler
Hepsini Temizle

C# - Socket - NetworkStream - TcpListener ile farklı client lardan gelen paketleri ayırt etme

2 Yazılar
2 Üyeler
0 Likes
3,931 Görüntüleme
(@SemihTUNALI)
Gönderiler: 32
Trusted Member
Konu başlatıcı
 

Merhabalar,

Önerilerinizi ve fikirlerinizi duymak isterim, hakikatten mantığı öğrenmek için açıklayıcı bir örnek üzerinden konuyu izah ettim.

TCP Listener konusu üzerine araştırma yapıyorum, internette olan birçok yerli / yabancı makaleleri okudum, verilen örneklere baktım.

Port dileniyor;

TcpListener dinle = new TcpListener(PortNo);

dinle.Start();

Socket soket = dinle.AcceptSocket();

if(soket.Connected)

{

      while(true)

      {

            NetworkStream akış = NetworkStream(soket);

            StreamWriter akışYazarı = new StreamWriter(soket);

            StreamReader akışOkuyucusu = new StreamReader(soket);

            string karakterKatarı = akışOkuyucusu.ReadLine();

            IstenilenIslem(karakterKatarı);

            akışYazarı.Write(karakterKatarı.Length.ToString());

            akışYazarı.Flush();

      }

      soket.Close();

}

Tamam, buraya kadar herşey normal gözüküyor.

Yalnız şöyle bir husus var, gerek IIS, gerek NGNIX ya da başka bir program, biliyorum, TCP iletim protokolü, HTTP uygulama protokolü, ama TCP de tabiri caizse session ya da request daha doğrusu talep / istek ya da esasında belkide en doğru tabir, veri kümesini nasıl ayırt ediliyor / tespit ediliyor ?

Burada örnek bir gönderim paket sayısı ve data kümesi senaryosu ve misaller tablosu olsun;

Bilirsininiz, gönderilen ve alınan paket sayıları ve boyutları değişebiliyormuş çünkü bir tampondan okuma sözkonusu olduğunu belirtiyor makaleler.

Örnek senaryo tablosu şöyle olsun;

3 farklı client tarafından HTTP veri kümesi gönderiliyor; basit bir anlatım için 3 ü de, 1200 byte olsun.

Clientlar aynı ip den paketleri yolluyorlarsa, ip den paket sahipliği tespiti mümkün gözükmüyor.

Örneğin 3 veri kümesi için de IP : 111.111.111.111

TCP Listener ----- Client

Paket No #1 --- 400 byte ------------ HTTP Küme #1 (Toplam alınan paket 1 & veri 400 byte)

Paket No #2 --- 600 byte ------------ HTTP Küme #2 (Toplam Alınan paket 1 & veri 600 byte)

Paket No #3 --- 200 byte ------------ HTTP Küme #2 (Toplam Alınan paket 2 & veri 800 byte)

Paket No #4 --- 600 byte ------------ HTTP Küme #3 (Toplam Alınan paket 1 & veri 600 byte)

Paket No #5 --- 200 byte ------------ HTTP Küme #2 (Toplam Alınan paket 3 & veri 1000 byte)

Paket No #6 --- 800 byte ------------ HTTP Küme #1 (Toplam Alınan paket 2 & veri 1200 byte)

Paket No #7 --- 100 byte ------------ HTTP Küme #2 (Toplam Alınan paket 4 & veri 1100 byte)

Paket No #8 --- 100 byte ------------ HTTP Küme #2 (Toplam Alınan paket 5 & veri 1200 byte)

Paket No #9 --- 600 byte ------------ HTTP Küme #3 (Toplam Alınan paket 2 & veri 1200 byte)

Evet bu örnek senaryodaki tabloda,

toplamda 3 farklı HTTP veri kümesi (her biri 1200 byte)

9 ayrı paketle (sıralı değil, rastgele ve farklı veri miktarları ile)

misal olarak gösterildi.

Şimdi her küme farklı clientlar tarafından iletildiğine göre, TcpListener tarafından dinlenerek Socket ile alınan veriler, NetworkStream tarafından nasıl 3 küme aslı olarak derlenip toplarlanacak?

Byte[] küme1;

Byte[] küme2;

Byte[] küme3;

Object[] kümeler;

kümeler[0] = küme1;

kümeler[1] = küme2;

kümeler[2] = küme3;

if(akis)

{

   int clientNumber = akis.client.number.ToString(); // Sözde kod

   int startPoint = akis.client.receivedPacketStartPoint; // Sözde kod

   kümeler[ clinetNumber ].byte[ startPoint ] += akisOkuyucusu.ReadLine();

}

Şimdi buradaki akis if ile kontrol ediliyor ama, (aslında mantıken çok daha karışık bir kontrol ve derleme mekanizması olmalı) akışın sıra numarası mı (sıra numarası varmış ama diğer akışların aynı sıra numarası olma ihtimaline karşın) bir seri nosu mu var, neye göre kümeler eski haline döndürülüyor işte burası anlamaya çalıştığım esas nokta. Bu konuda yabancı ya da tercihen yerli bir makale de bulamadım şimdiye kadar.

Yani Nginix, IIS ya da başka bir TCP protokolü alıcısı, bu verileri neye göre toplarlıyor ve alınan paketleri birleştirip eksiksiz bir küme haline getiriyor ?

Küme ---------> Gönderilen Paketler ve TCP Protokolü -----------> Küme

 

Özetle,

client 1 http requesti için küme 1 i gönderdi;

client 2 http requesti için küme 2 yi gönderdi,

client 3 http requesti için küme 2 ü gönderi,

her bir küme tcp protokolü ile ayrı paketlerle geldi ve sonra tekar derlenerek birleştiriliyor ama nasıl ?

 

Burada her 3 ayrı veri kümesi için, bir başlangıç flag değeri var mıdır ?

Eğer tcp bir protokol ise, veri iletimi / paket transferi için bir başlangıç, devam ve bitiş flagları olmalı.

Paket başlangıç, transfer devamı ve bitişi her client için / veri kümesi için nasıl tespit edilebiliyor .net ile ?

 

Önerilerinizi ve bilgilerinizi paylaşmanız beni mutlu edecektir.

 
Gönderildi : 27/01/2018 23:33

(@EmreBORA)
Gönderiler: 9
Active Member
 

Hocam Selamlar;

Bilmiyorum doğrumu anladım sorduğun soruyu ama ben kendi kullandığım bir listener üzreinden çalışmasını anlatarak cevap vereceğim. 

Şöyleki bir listener var ve onlarca client var. Listener bağlanan clientlerden gelen talepleri tamamen işlem sırasına göre işler. Yani veriler listener üzerine gelir ve kuyrukta bekler. 

Başa gelecek olursam;

Bir ip ve port üzerine clientler request gönderir. Bizim listener bir veri geldiğini görür önce bu gerçekten benim listenerıma bağlanması gereken client mi değil mi buna bakar. (Her client listenera gelirken benim belirlediğim bir cümle ile gelir.) Örn : #eb 

Listener gelen sorgu içinde #eb yi görünce cliente #tm parametre olarak gönderir client eğer bizim db üzerindeki liste içinde olan bir hash kodu dönerse bunun verisini işlemeye başlar. 

Sırasıyla tüm gelen talepleri bu şekilde çözümleyerek çalışmasına devam eder. 

Umarım doğru anlamışımdır 🙂 Çok alakasız bir dönüşde yaptıysam kusura bakmayın. 

 
Gönderildi : 04/06/2018 01:46

Paylaş: