C# TCP-UDP Soket Programlama

Başlatan polleme, 05 Ağustos 2013, 15:35:23

polleme

Merhaba,

Sitede Visual C# ile ilgili yüzlerce konu var ama genellikle seri port üzerinden iletişim konusu çokça işlenmiş. Linux tabanlı bir kart veya GSM modülden TCP veya UDP olarak bir Windows PC'ye bağlanıp very iletmek istesek PC'de bir TCP veya UDP soket açmamız gerekir. Ama bunu nasıl yapacağımızı temelleriyle basit olarak anlatacak bir kaynak bulamadım. Bu sitede de çok geçmiyor. Bu konuda bana kitap veya kaynak önerebilecek bir arkadaşımız var mıdır? Yapmak istediğim, PC'de bir TCPClient form uygulaması oluşturmak, gelen verileri ekranda form üzerinde göstermek ve gerekirse bunları bir veritabanına yazmak.

Şimdiden teşekkürler.

Gökhan BEKEN

Barış Samancı ethernet uygulamalarında bu örnekler var ve C# ile yapılmış. Direkt işinizi görmese bile fikir vereceği kesin.
http://www.barissamanci.net/Makale/3/microchip-stack-v520-yaptiginiz-donanimlari-dunyaya-acin
Özel mesaj okumuyorum, lütfen göndermeyin.

RcALTIN

#2
UDP connectionless bir protokol olduğundan bununla haberleşmek daha kolay, tcp de her client için ayrı bir thread içerisinde dinleme yapmaktan başka bir yol var mı bilmiyorum, threadpool oluşturarak da çözüm üretilebilir tabi. bir projemden direkt copypaste çekirdek udp server kısmı aşağıda. özetle bir thread içerisinde sürekli dinleme yapılıyor, her veri geldiğinde onDataReceived delagate'ine bağlayacağın fonksiyonları tetikleyip veriyi işliyorsun. bu örnekten sana gereken kısımı ayıklayıp alabilirsin...

/*////////////////////////////////////////////////////////////////////////////////////
///               A   _____                   __                                   ///
///                  /  _  \                 /  \                                  ///
///                  | |_| |    ____        / /\ \                                 ///
///                  |  _  /   /  __\      | |__| |                                ///
///                  | | \ \   | |___   _  |  __  |  _                             ///
///                  |_|  \_\  \____/  |_| |_|  |_| |_|                            ///
///                                                      code file.                ///
//////////////////////////////////////////////////////////////////////////////////////
/// This code file is part of a Recep ALTIN's project. You do not have permission  ///
///       to sharing following codes of this file without personal approval.       ///
//////////////////////////////////////////////////////////////////////////////////////
///                     Copyright (c) 2013 Recep ALTIN                             ///
////////////////////////////////////////////////////////////////////////////////////*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace gpGameServer
{
    public sealed class NetworkManager
    {
        const int NETWORK_BUFFER_SIZE = 128;
        public static readonly object lockObj = new object();

        public bool debugMode = false;
        public delegate void DataReceivedEvent(EndPoint ep, byte[] data, int byteCount);
        public event DataReceivedEvent onDataReceived;
        static NetworkManager instance;
        Socket socket;
        Thread thListener;

        //ctor
        private NetworkManager() { }

        public static NetworkManager Singleton()
        {
            if (instance == null)
                instance = new NetworkManager();

            return instance;
        }

        public void Initialize(int portNumber)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, portNumber);
            socket.Bind(groupEP);
            LogManager.Singleton().LogMessage("[Network Engine] UDP Server initialized. Port: " + portNumber);

            thListener = new Thread(new ThreadStart(UDPListener));
            thListener.IsBackground = true;
            
        }

        public void StartListener()
        {
            thListener.Start();
            LogManager.Singleton().LogMessage("[Network Engine] Server started...");
        }

        public void StopListener()
        {
            thListener.Abort();
            LogManager.Singleton().LogMessage("[Network Engine] Server stopped...");
        }

        private void UDPListener()
        {
            IPEndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
            EndPoint ep = clientEP as EndPoint;


            // loop
            while (true)
            {
                try
                {
                    byte[] recieveBuffer = new byte[NETWORK_BUFFER_SIZE];
                    int bc = socket.ReceiveFrom(recieveBuffer, ref ep);
                    
                    onDataReceived(ep, recieveBuffer, bc);
                }
                catch (SocketException ex)
                {
                    LogManager.Singleton().LogMessage(ex.ToString());

                    //to do: ep rejected data, remove ep(player)
                }

            }
        }

        public void SendPacket(NetworkPacket p)
        {
            try
            {
                lock (lockObj)
                {
                    socket.SendTo(p.ToBuffer(), p.EndPoint);
                    if (debugMode)
                        Thread.Sleep(25);
                }
            }
            catch (SocketException ex)
            {
                LogManager.Singleton().LogMessage(ex.ToString());
            }
           
            
        }
    }
}


sınıfı olduğu gibi kullanmak için:
// network manager
                netMgr = NetworkManager.Singleton();
                netMgr.Initialize(11000); //port
                netMgr.onDataReceived += new NetworkManager.DataReceivedEvent(DataReceivedEventHandler); //
                netMgr.StartListener();
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

polleme

TCP veya UDP uygulamasını C# yanında Java ve Python ile de inceliyorum. PC tarafında hangisi uygulama açısından kolay gelirse onu tercih edeceğim, her üçünde de GUI yapılabiliyor. Uzak uçta ise Raspberry Pi olacağından Java, C veya Python seçenekleri oluşturacak.