• Forum vBulletin altyapısından Xenforo altyapısına geçirildi, bu sebeple eski şifreleriniz ile foruma giriş yapamayacaksınız, parolamı unuttum adımından mailiniz ile şifre sıfırlayarak giriş yapabilirsiniz.

    Üyeliklerinde geçerli bir mail adresi olmadığı için sıfırlama yapamayacak kullanıcılar forum kullanıcı adlarını ve yeni şifrelerini yazarak info@maxigame.org adresine şifre sıfırlamak istediklerine dair bir mail göndersinler şifrelerini sıfırlayıp mail adreslerini güncelleyeceğiz. Şifreniz sıfırlandıktan sonra foruma giriş yapıp tekrar istediğiniz gibi değiştirebilirsiniz.

C# Socket Programlama

  • Konuyu başlatan Konuyu başlatan detCode
  • Başlangıç tarihi Başlangıç tarihi

detCode

Banlanmış Üye
Aktiflik
K.Tarihi
28 Nis 2011
Mesajlar
55
Puanı
11
Merhaba arkadaşlar..

Şimdi anlatmaya çalışacağım şey C#'da socket kullanımı, veri gönderme veri almak, birden çok client kabul etmek vb.

Kodlayacağımız şey server olarak düşünebilirsiniz. Gelen bütün bağlantıları kabul edicek başlayalım..

Kod:
        public static Socket ListenClient = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

ListenClient adında bir socket tanımladık.

Kod:
            try
            {
                ListenClient.Bind(new IPEndPoint(IPAddress.Parse("string ip adresiniz"), intportunuz));
                ListenClient.Listen(0);
                Console.WriteLine("Listening Clients..");
            }
            catch
            {
                Console.WriteLine("Error Starting Server");
                Console.Read();
                return;
            }
            Thread acceptThread = new Thread(new ThreadStart(handleConnections));
            acceptThread.Start();

ListenClient'i dinleme moduna aldık sonrada gelen bağlantıları kabul etmesi için handleConnections thread oluşturup. Threadı başlattık.


Kod:
        public static void handleConnections()
        {
            while (true)
            {
                Socket ClientSocket = ListenClient.Accept();
                Clients ShardClient = new Clients(ClientSocket);
                Thread.Sleep(5);
            }
        }

handleConnections fonksiyonumuz gelen bütün bağlantılar döngü içerisinde kabul edilicek. Kabul edildikten sonra yeni bir Clients sınıfı oluşturup oraya atıcak socketimizi. Bu bağlantı kabul edildikten sonra tekrar bağlantı gelebilir sorun yok herseferinde Clients'e atıp birtane daha veriyi almak için döngü oluşturucak.

Clients.cs classımıza bakalım.


Kodu baştan itibaren koydum nereye ne yazıldığını göresiniz diye
Kod:
namespace detG
{
    class Clients
    {
        public static Socket realshard = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private Socket ClientSocket;
        public Clients(Socket tSocket)
        {
            ClientSocket = tSocket;
            Thread crecvThread = new Thread(new ThreadStart(ClientrecvData));
            crecvThread.Start();
            Console.WriteLine("Connected. IP:"+ IPAddress.Parse(((IPEndPoint)ClientSocket.RemoteEndPoint).Address.ToString()));
        }


Bir önceki kodda Clients ShardClient = new Clients(ClientSocket); bu kısımda yukarda belirttiğim classtan bitane oluşturdu. Clients fonksiyonunua gönderdi socketi data sonrada dinlemek için tekrar birtane thread oluşturduk ClientrecvData ismi ile

recv. döngümüz
Kod:
        private void ClientrecvData()
        {
            byte[] rBuffer = new byte[1024];
            byte[] rPacket;
            int rLength = 0;
            while (true)
            {
                try
                {
                    rLength = ClientSocket.Receive(rBuffer, 0, rBuffer.Length, SocketFlags.None);
                }
                catch
                { }


                if (ClientSocket.Connected && rLength > 0)
                {
                    rPacket = new byte[rLength];
                    Array.Copy(rBuffer, 0, rPacket, 0, rLength);
                    //gelen data burda rPacket byte array şeklinde
                }
                else
                {
                    //disconnected.
                    break;
                }
            }
        }


bu döngü ile veri gelirse gelen veriyi alabiliriz. Byte array dan string'e çevirmek için Encoding.UTF8.GetString(rPacket) ile stringe çevirebilirsiniz.

Veri gönderirken ise aşağıdaki gibi yollayabilirsiniz.

Kod:
string senddata = "detCode";
ClientSocket.Send(Encoding.UTF8.GetBytes(senddata));


Şimdilik bu kadar. Bir kusurum olduysa affola sağlıcakla kalın..
 
C# yeni başladımda bildiğin iyi bir kaynak varmı 0'dan.
Konu çok iyi bu arada.

eyv. Yok kaynak ama takıldığın yerde mesaj atabilirsin veya yardım bölümü var ise oraya konu açabilirsin elimden geldiğince cevaplamaya çalışırım
 
Konu için teşekkürler.
Sürekli aktif olman dileği ile. :)

Birşey sormak istiyorum sana, bir .exe ye veri gönderiyorum, atıyorum bu Integer &H1E olsun veya &H90 olsun. (Tabi gönderirken bütün BinaryWriter, FileStream, Byte() değerlerimiz çalışıyor. Sen biliyorsun silkroad bot işleri anlarsın sen.) İşte bu değerin decimal karşılığını nasıl bulabilirim ? Çok fazla araştırdım, bulamadım.
Yardımcı olabilirsen sevinirim.
 
eyv. Yok kaynak ama takıldığın yerde mesaj atabilirsin veya yardım bölümü var ise oraya konu açabilirsin elimden geldiğince cevaplamaya çalışırım

Sadece autoit hakkında bilgim var c# hiç yok kütüphane değerler hiç bir bilgim yok bunları işlevleriyle öğrenmeliyim bunlarla ilgili bi konu açabilirmisin rehber olarak?
 
Moderatörün son düzenlenenleri:
Konu için teşekkürler.
Sürekli aktif olman dileği ile. :)

Birşey sormak istiyorum sana, bir .exe ye veri gönderiyorum, atıyorum bu Integer &H1E olsun veya &H90 olsun. (Tabi gönderirken bütün BinaryWriter, FileStream, Byte() değerlerimiz çalışıyor. Sen biliyorsun silkroad bot işleri anlarsın sen.) İşte bu değerin decimal karşılığını nasıl bulabilirim ? Çok fazla araştırdım, bulamadım.
Yardımcı olabilirsen sevinirim.

Şimdi bunlar &H1E hex olması lazım tam bilmiyorum c# da böyle kullanılmıyor. vb6 veya vb.net de böyle sanırım.
hex den int yapmak için (c#'da böyle)
Console.WriteLine(Convert.ToUInt32("hexdeğeri", 16)); hexdeğerine 0x01 0x02 0x05 0x0A 0x1A... yazabilirsin
tam tersini yapmak için dec to hex

int decValue = 182;
String hexValue = decValue.ToString("X");
Console.Writeline(hexValue);

----------



Sadece autoit hakkında bilgim var c# hiç yok kütüphane değerler hiç bir bilgim yok bunları işlevleriyle öğrenmeliyim bunlarla ilgili bi konu açabilirmisin rehber olarak?


Rehper hazırlıcak kadar vaktim yok ancak soru sorarsan cevaplayabilirim.
 
Socket ile uğraşacak arkadaşlar unutmasın ki ; Kütüphane olarak kesinlikle ; bunları Import etmelisiniz.


using System.Net;
using System.Net.Sockets;
ve thread işlemleri için ,
using System.Threading;
 
Birden fazla bağlantıda her cliente aynı veriyi nasıl yollatmalıyım fikri olan varmı?
 
Birden fazla bağlantıda her cliente aynı veriyi nasıl yollatmalıyım fikri olan varmı?

Tam senin aradığın rehber burada. Kullanman gereken ForEach ile istediğin client e return yapacaksın. For döngüsü ile de sockete bağlı clientlerin lengh yani uzunluk alarak tekrarlayacaksın, Döngünün içinede bakılan clientin ip port alacaksın. İnternette örnekler mevcut zaten.
 
halledemedim not her yeni kisi için ayrı theread oluşturuyorum ve gelenlerin iplerini listboxda topluyorum
 
Bir array list oluştur ve for döngüsü ile kontrol et. ;)
 
Son düzenleme:
Geri
Üst