ÇözümPark'a hoş geldiniz. Oturum Aç | Üye Ol
 
Ana Sayfa Makale Video Forum Resimler Dosyalar Etkinlik Hizmetlerimiz Biz Kimiz

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

Son Mesajınız 01-27-2018, 20:33 Semih TUNALI tarafından gönderildi. 0 yanıt.
Mesajları Sırala: Önceki Sonraki
  •  01-27-2018, 20:33 525439

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

    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.

RSS haberlerini XML olarak görüntüle