none
client-server arasında socket ile bağlanıyorum fakat ? RRS feed

  • Soru

  • selam arkadaşlar client-server arasında bir bağlantı oluşturuyorum. local olarak çalışıyor. fakat şöyle bir sorunum var.

    Şimdi, uzaktaki ip adresi ve portu yazıyorum. ip ve port yazmama rağmen belirtmiş olduğum port üzerinden bağlanmıyor. Aşağıda client ve server kodlarım mevcuttur. yardımlarınızı bekliyorum.

    Ayrıca port yönlendirmelerini yaptım. yönlendirme yaptıgım port 4001.fakat bağlantı sağlandığında lstClient listesi içerisine ip adresini yazıyor fakat belirmiş olduğum port üzerinden değilde kendisi farklı bir port belirliyor.

    Client kodları

     Socket soket, gonderSoket;
            //IPAddress serverIP;
            string TCP_PORT;
    
    void baglantilaridinle()
    {
        if (soket == null)
                {
                    BaglantilariDinle();
                }
                else
                {
                    rchHataMesajlari.AppendText("Bağlantı dinleniyor...");
                }
    }
    
         private void btnDinle_Click(object sender, EventArgs e)
            {
                if (soket != null)
                {
                    BaglantilariKes();
                }
                else
                {
                    BaglantilariDinle();
                }
            }
            void BaglantilariDinle()
            {
                //if (soket==null)
                //{
                    soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    int port = Convert.ToInt32(TCP_PORT);
                    //IPEndPoint ep = new IPEndPoint(serverIP, port);
                    IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
                    soket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
                    soket.Bind(ep);
                    soket.Listen(50);
                    soket.BeginAccept(new AsyncCallback(BaglantiKabul), null);
                    lstClient.Items.Clear();
                    rchHataMesajlari.AppendText("BAĞLANTILAR DİNLENİYOR..." + DateTime.Now.ToLongTimeString());
                    btnDinle.Text = "BAĞLANTIYI KES";
                    //txtPort.Enabled = false;
                //}
    
            }
            void BaglantilariKes()
            {
                if (soket.Connected)
                    soket.Disconnect(true);
                soket.Close();
                soket = null;
                btnDinle.Text = "BAĞLANTIYI DİNLE";
                //txtPort.Enabled = true;
                rchHataMesajlari.AppendText("BAĞLANTI KESİLDİ..." + DateTime.Now.ToLongTimeString());
            }
    
      private void BaglantiKabul(IAsyncResult ar)
            {
                try
                {
                    if (true)
                    {
                        Client c = new Client(1024);
                        c.ClientSoket = gonderSoket = soket.EndAccept(ar);
                        lstClient.Items.Add(c.ClientSoket.RemoteEndPoint.ToString());
                        c.ClientSoket.BeginReceive(c.Data, 0, c.Data.Length, SocketFlags.None, new AsyncCallback(VeriKabul), c);
                        soket.BeginAccept(new AsyncCallback(BaglantiKabul), null);
                    }
                }
                catch (Exception)
                {
                    rchHataMesajlari.AppendText("Bağlantılar dinlenmiyor... " + DateTime.Now.ToLongTimeString());
                    soket = null;
                }
            }
        private void VeriKabul(IAsyncResult ar)
            {
                try
                {
                    Client c = (Client)ar.AsyncState;
                    c.ClientSoket.EndReceive(ar);
                    c.IP = IPAddress.Parse(c.ClientSoket.RemoteEndPoint.ToString().Split(':').GetValue(0).ToString());
                    c.Port = Convert.ToInt32(c.ClientSoket.RemoteEndPoint.ToString().Split(':').GetValue(1));
                    c.Mesaj = Encoding.UTF8.GetString(c.Data);
    
                    string[] mesajDegerleri = c.Mesaj.Split('-');
                    string gosterilecekYazi = mesajDegerleri[0] + ": " + (ConvertToInt32Safely(mesajDegerleri[1]) + ConvertToInt32Safely(mesajDegerleri[2]) + ConvertToInt32Safely(mesajDegerleri[3]) +
                        ConvertToInt32Safely(mesajDegerleri[4]) + ConvertToInt32Safely(mesajDegerleri[5]) + ConvertToInt32Safely(mesajDegerleri[6]) + ConvertToInt32Safely(mesajDegerleri[7]) + 
                        ConvertToInt32Safely(mesajDegerleri[8]) + ConvertToInt32Safely(mesajDegerleri[9]) + ConvertToInt32Safely(mesajDegerleri[10]) + ConvertToInt32Safely(mesajDegerleri[11]) +
                        ConvertToInt32Safely(mesajDegerleri[12])).ToString();
    
                    rchTxtMesaj.AppendText("Client: " + gosterilecekYazi + "\r\n");
                    Array.Clear(c.Data, 0, c.Data.Length);
                    c.ClientSoket.BeginReceive(c.Data, 0, c.Data.Length, SocketFlags.None, new AsyncCallback(VeriKabul), c);
    
                   
                }
    
                catch (Exception)
                {
                    rchHataMesajlari.AppendText("ALICI BAĞLANTIYI KESTİ !, DİNLEME İŞLEMİNİ YENİLEYİN... " + DateTime.Now.ToLongTimeString());
                    soket = null;
                }
            }
        private int ConvertToInt32Safely(string p)
            {
                int retVal = 0;
                try
                {
                    retVal = Convert.ToInt32(p);
                }
                catch (Exception)
                {
                }
                return retVal;
            }

    server tarafım

     #region TCP BAĞLANTI TANIMLAMALARI
            Socket soket;
            #endregion
    
        #region CLİENT - SERVER BAĞLANTISI
            private void VerileriniGonder(string metin, string s1, string s2, string s3, string s4, string s5, string s6, string s7,
                                             string s8,string s9,string s10,string s11, string s12)
            {
                try
                {
                    if (soket != null)
                    {
                        soket.Send(Encoding.UTF8.GetBytes(metin + "-" + s1 + "-" + s2  +"-" + s3 + "-" + s4 + "-" + s5 + "-" + s6 + "-" + s7 + "-" + s8 + "-" + s9 + "-" + s10 + "-" + s11 + "-" + s12));
                    }
                    else
                        rchHataMesajlari.AppendText("veriler gönderilemedi : " + DateTime.Now.ToLongTimeString() + "\r\n");
                }
                catch (Exception)
                {
                }
            }
            private void BaglantiKabul(IAsyncResult ar)
            {
                try
                {
                    Server s = new Server(1024);
                    s.ServerSoket = (Socket)ar.AsyncState;
                    s.ServerSoket.EndConnect(ar);
                    s.ServerSoket.BeginReceive(s.Data, 0, s.Data.Length, SocketFlags.None, new AsyncCallback(VeriKabul), s);
                }
                catch (Exception)
                {
                    rchHataMesajlari.AppendText("Uzaktan kumandaya bağlanılamıyor... " + DateTime.Now.ToLongTimeString());
                    soket = null;//soket değerini null yaptık. tmrBaglantiKontrol kontrol edecek
                }
            }
            private void VeriKabul(IAsyncResult ar)
            {
                try
                {
                    Server s = (Server)ar.AsyncState;
                    s.ServerSoket.EndReceive(ar);
                    s.IP = IPAddress.Parse(s.ServerSoket.RemoteEndPoint.ToString().Split(':').GetValue(0).ToString());
                    s.Port = Convert.ToInt32(s.ServerSoket.RemoteEndPoint.ToString().Split(':').GetValue(1));
                    s.Mesaj = Encoding.UTF8.GetString(s.Data);
                    string[] mesajDegerleri = s.Mesaj.Split('-');
                    string gosterilecekYazi = mesajDegerleri[0] + ": " + (ConvertToInt32Safely(mesajDegerleri[1]) + ConvertToInt32Safely(mesajDegerleri[2])).ToString();
                    rchTxtMesaj.AppendText("Server: " + gosterilecekYazi + "\r\n");
                    Array.Clear(s.Data, 0, s.Data.Length);
                    s.ServerSoket.BeginReceive(s.Data, 0, s.Data.Length, SocketFlags.None, new AsyncCallback(VeriKabul), s);
    
    
                    }
                    catch (Exception)
                    {
                        //VeriGonder("Arduino karta veri gönderilemedi. Comport yeniden başlatın.", " ", ex.Message);
                    }
                    #endregion
    
                  
    
                }
                catch //(Exception)
                {
                    //rchHataMesajlari.AppendText("uzaktan kumanda kapatıldı");
                    //BAĞLANTI YOKSA SOKET DEĞERİNİ BOŞ YAP
                    soket = null;
                }   
            }
            void BaglantiYap()
            {
                IPAddress serverIP;
               
                if (IPAddress.TryParse(TCP_IP, out serverIP))
                {
                    soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    soket.BeginConnect(serverIP, Convert.ToInt32(TCP_PORT), new AsyncCallback(BaglantiKabul), soket);
                    //txtPort.Enabled = txtIP.Enabled = false;
                }
                //SOKET DEĞERİ NULL'DAN FARKLIYSA VE UZAKTAN KUMANDAYA BAĞLANDIYSA, COMPORTLARa BAĞLAN
                //if (soket.Connected == true)
                //if (soket != null)
                //{
                ////YEREL ALICI ARDUİNO BAĞLANTISI YAP
                //YerelAliciBaglantisi();
                //GPS_PortBaglantisiYap();
                //label1.Text = "baglanmıs";
                //}
            }
            void BaglantiyiKes()
            {
                if (soket.Connected)
                    soket.Disconnect(true);
                soket.Close();
                soket = null;
                //txtPort.Enabled = txtIP.Enabled = true;
            }
            private int ConvertToInt32Safely(string p)
            {
                int retVal = 0;
                try
                {
                    retVal = Convert.ToInt32(p);
                }
                catch (Exception)
                {
                }
                return retVal;
            }
            #endregion


    • Düzenleyen fftthh 18 Kasım 2015 Çarşamba 08:56
    18 Kasım 2015 Çarşamba 08:55

Yanıtlar

  • Siz bu kodu çok uzatmışsınız, TCPListener ve TCPClient kullansanız çok daha kısa şekilde halledebilirdiniz. İşin açıkçası kodu incelemeye üşendim, ama Serverde RemoteEndPoint belirlediğiniz gibi LocalEndPoint te belirlemelisiniz.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    18 Kasım 2015 Çarşamba 09:42
    Moderatör

Tüm Yanıtlar

  • farklı dediğin port local portun olmasın?

    Örn.; A makinesinden B makinesine 8000 portundan bağlanırken;

    A(14278)   --->  B(8000)

    şeklinde bağlanır. Eğer LocalEndPoint ile bir port belirtmediysen, local için sıradaki/rastgele boş port bir numarası alır.

    Bu durum neden sorun çıkardı ki;

    B makinasında "ben sadece 8000 portuma gelen ve karşı makinenin 8001 portu ile çıkan bağlantıları kabul ederim" gibi bir durum yoksa local portunun ne olduğu önemli değil. Kaldı ki arada routerler falan varsa iş daha da karışır, Roterlere de NAT yaparken 8001 yazmak gerekir.


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    18 Kasım 2015 Çarşamba 09:19
    Moderatör
  • cevabınız için teşekkür ederim. ben hotspot noktasından bağlanıyorum ve mikrotik cihazımda belirtilen port yönlendirmelerini yaptım. 

    rastgele port almaması için ve sizin B seçeneğinizi nasıl yapabilirim ?

    sabit bir ip adresim ve sadece 4001 portum açık

    18 Kasım 2015 Çarşamba 09:30
  • Siz bu kodu çok uzatmışsınız, TCPListener ve TCPClient kullansanız çok daha kısa şekilde halledebilirdiniz. İşin açıkçası kodu incelemeye üşendim, ama Serverde RemoteEndPoint belirlediğiniz gibi LocalEndPoint te belirlemelisiniz.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    18 Kasım 2015 Çarşamba 09:42
    Moderatör
  • merhaba soket programlamada yeniyim. bu kod hazır geldi arkadasımdan. suanda ona ulaşamıyorum. localendpoint nasıl belirleyebilirim kod bloğuna ekleyebilir misiniz
    18 Kasım 2015 Çarşamba 10:01