IRCDForum.COM - IRC ve mIRC dünyasının forumu!   irc hosting


  IRCDForum.COM - IRC ve mIRC dünyasının forumu! IF - Programlama / Yazılım Genel Programlama C ve C++


Yeni Konu   Cevap Yaz

 
LinkBack Seçenekler Stil
Alt 18 Ekim 2015, 21:15   #1
 
Code - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: 01 Mart 2015
Mesajlar: 203
WEB Sitesi: www.code.com
IRC Sunucusu: irc.code.com
İlgi Alanı:
Alınan Beğeni: 33
Standart Socket(Soket) Programlama

Soket programlama ile Network Application dersinde tanıştım, çok uzun ve sinir bozucu günler sonrasında soket projemi bitirdim ama o sıralar da bende bitmiştim.

İşin mantığını anladım aslında soket işlemleri ile dosya işlemleri aynı ve soket programlama zevkli bi iş mesela kendi mesajlaşma programınızı yapabilirsiniz fakat işin zor kısmı benim projem için bunu C dilinde yapmaktı, lisans hayatım boyunca nefret ettiğim ve beni yazılımdan soğutan C programlama dili.


Soket programlama yapabilmeniz için işin teorik kısmını da bilmeniz gerekiyor, mesela port numarası, soket, TCP, UDP gibi kavramlardan haberdar olmanız lazım çünkü işin temeli bunlar.şimdi gelelim “SOKET” nedir sorusuna…



SOKET ve PORT Kavramları
İki farklı bilgisayarda çalışan işlemlerin(process) birbirlerine mesaj göndermek istediklerini düşünelim, bunun için tabiyki bazı adreslere ihtiyacımız var bunların ilki iletişim kuracağımız bilgisayarın IP adresi, IP adresini biliyoruz ve karşımızdaki bilgisayarı bulduk ama bizim amacımız o bilgisayardaki belirli bi programla iletişime geçmek işte bunun için de o programın port numarasını bilmemiz gerekiyor.


Soket’i evimizin kapısı olarak düşünebiliriz. Evimizden (bilgisayarımız) dışarıy açıkmak için (network) bu kapıdan geçmek zorundayız Aklımıza gelebilecek hertürlü internet programı soket program olarak çalışır. Örneğin web programları 80. portu, FTP programları 21. portu kullanan soket programlarıdır.


Soket Türleri
Çeşitli soket türleri vardır fakat en çok kullanılanları “Stream Soketler”, “Datagram Soketler” ve “Raw Soketler” ‘dir. Bunlar programlamada “SOCK_STREAM”, “SOCK_DGRAM”, ve “SOCK_RAW” isimleriyle tanımlanır. Programlama yapılırken soket() türü belirtilir, Stream soketler Connectio-Oriented, Datagram soketler Connectionless’dir.



Stream soketler Transport katmanında bulunan TCP’yi kullanır, Datagram soketler transport katmanındaki UDP’yi kullanır. Bu iki tür arasındaki temel farklılıklar şunlardır;
  • Stream soketler verileri sıralı gönderiri (paketler halinde), datagram soketler sıralı göndermeyebilir.
  • Stream soketler veri bütünlüğünü ve verinin karşı tarafa ulaştığını garanti eder (Acknowledgement-Retransmission), Datagram soketler bunu garanti etmez.
  • Stream soketler gönderme işlemi bitene kadar kesintisiz bağlantı (TCP bağlantısı) kurar fakat Datagram soketler veriyi gönderdikten sonra bağlantıyı keser.
Soket uygulamaları herzaman iki uçludur, gönderici-alıcı yani client-server mimarisine göre çalışır. Alıcı program ile gönderici program arasında bazı farklılıklar vardır;
CLIENT SERVER Soket oluştur socket( ) Soket oluştur socket( ) Sunucu adres bilgilerini yerle tir struct sockaddr_in server_addr Soketi adres ve isim bilgileri ile ili kilendir bind() Soketi dinleme moduna geç listen() Bağlantı yap connect() Bağlantıyı kabul et accept() Veri gönder send() Veri al recv() Veri al recv() Veri gönder send() Soketi kapat close() Soketi kapat close() struct sockaddr {
unsigned short sa_family; // adres ailesi, AF_xxx
char sa_data[14]; // protokol adresinin 14 byte’
};


struct sockaddr : Bu veri yapıs pek çok türde soket için soket adres bilgisini barındırır.
sa_family pek çok de erden birini alabilir. Ama bu anlatımda sadece AF_INET (ARPA Internet protocols)
kullanılacaktır.
AF_UNIX (UNIX internal protocols)
AF_INET (ARPA Internet protocols)
AF_ISO (ISO protocols)
AF_NS (Xerox Network Systems protocols)
AF_IMPLINK (IMP “host at IMP” link layer)
sa_data ise soketle ilgili hedef adres ve port numaras bilgilerini barındırır.
struct sockaddr ile başa çıkabilmek için buna paralel bir yapı olarak struct sockaddr_in tasarlanmıştır.
struct sockaddr_in {
short int sin_family; // Adres ailesi
unsigned short int sin_port; // Port numaras
struct in_addr sin_addr; // Internet adresi
unsigned char sin_zero[8]; // struct sockaddr ile ayn boyda
};
Bu yapı soket adresi elemanlarına erişmeyi kolaylaştırır. Buradaki : sin_zero, memset() işlevi kullanılarak tamamen sıfır ile doldurulmalıdır. sin_family değişkeninde struct sockaddr yapısındaki sa_family değişkenine karşılık gelir ve bizim örneğimizde “AF_INET” olarak ayarlanmalıdır. Son olarak sin_port ve sin_addr değişkenlerininde Ağ Byte Sırasında bulunmaları gerekir.
Soket Programlama Sistem Çağrıları

Socket () Sistem Çağrısı
int socket (int domain, int type, int protocol)
Bizim örneklerimizde “domain” argümanına AF_INET değeri verilmeli. Sonra “type” değişkeni çekirdeğe ne tür bir soketle çalışılacağını söyler SOCK_STREAM yada SOCK_DGRAM. Son olarak da “protokol” argümanına “0” değeri verilir ki socket (), type değişkenine karşılık gelen uygun protokolü seçebilsin.


Socket () işlemi bir soket tanımlayıcısı döndürür ve bu dahasonraki işlemlerde parametre olarak kullanılır. Eğer bir haat oluşursa işlem -1 değerini döndürür.Bu durumda “errno” adlı global değişken hata kodunu tutar.
Bind ( ) Sistem Çağrısı
int bind (int sockfd, struct sockaddr *my_addr, int addrlen)
Bir soket oluşturduk şimdi bunu makinamızdaki bir “port” numarası ile ilişkilendireceğiz. Eğer sadece connect ( ) ile biyere bağlanacaksak buna gerek yoktur. “sockfd” değeri, socket ( ) tarafından döndürülen soket dosya tanımlayıcısıdır. “my_addr” değişkeni “struct sockaddr” türünde bir veriye point eder ve bu yapıda adresimizi yani IP adresimizi ve port numaramızı tutar.


my_addr.sin_port = htons(0); // kullanılmayan herhangi bir port’u seç
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP adresimi kullan
my_addr.sin_port değişkeninin değerini sıfır yaparak bind() işlevi uygun olan bir port sayısını bizim için seçer. Benzer şekilde my_addr.sin_addr.s_addr değişkeninin değerini INADDR_ANY yaparak üzerinde çalıştığı makinanın IP adresini almasını söylemiş oluruz.


bind() eğer bir hata çıkarsa -1 değerini döndürür ve “errno” isimli hata kodu değişkenine gerekli sayıyı yerleştirir. bind() işlevini çağırırken dikkat edilmesi gereken bir başka şey de şudur , port numarası olarak 1024’ün altındaki bir değer seçilmemeli. Çünkü 1024 ten küçük tüm portlar REZERVE edilmiştir . Bu sayıdan başlayarak 65535’e kadar olan sayılardan birini, seçtiğiniz numara başka bir program tarafından kullanılmıyorsa port numarası olarak kullanabilirsiniz.


Connect ( ) Sistem Çağrısı
int connect (int sockfd, struct sockaddr *serv_addr, int addrlen)
Uzaktaki bilgisayara bağlanmak için gereklidir. “sockfd” değişkeni socket ( ) sistem çağrısı tarafından döndürülmüş olan soket dosya tanımlayıcısının değerini tutar. “serv_addr” ise struct sockaddr türünde bir değişkendir ve hedef port ile IP adres bilgilerini barındırır. “addrlen” değişkeni de sizeof (struct sockaddr)değerini alır.


Listen ( ) Sistem Çağrısı
int listen (int sockfd, int backlog)
Bu süreç iki aşamadan oluşur, önce Listen ( ) ile dinlenir sonra Accept ( ) ile gelen çağrılar kabul edilir. “backlog” gelen çağrı kuyruğunda izin verilen bağlantı sayısını gösterir. Gelen bağlantı talepleri siz onları accept() ile kabul edene dek bir kuyrukta bekler ve işte bu kuyruğun ne kadar uzun olacağının belirlenmesinde kullanılır. Buna 5 veya 10 gibi bir değerler kullanabiliriz.
***** listen() işlevinden önce bind() işlevi çağırılmalıdır, yoksa işletim sistemi çekirdeği bu dinleme işlemini gelişigüzel bir port üzerinden yapmaya başlar.


Accept ( ) Sistem Çağrısı
int accept (int sockfd, void *addr, int *addrlen)
connect() işevi ile listen() ile dinlenen bir porta bağlanmaya çalışılır. Bu bağlantı talebi accept() ile kabul edilene dek kuyrukta bekler. accept() işlevi çağırılarak ,ona beklemekte olan çağrıyı kabul etmesini söylenir. O da yeni bir soket dosya tanımlayıcısı döndürür,sadece söz konusu bağlantıya özel. Orjinal olan socket tanımlayıcısı halen port üzerinden dinleme işlemini gerçekleştirmek için kullanılıyor yeni olarak yaratılmış olan ise send() ve recv() işlevlerinde kullanılır.


Send ( ) ve Recv ( ) Sistem Çağrıları
int send (int sockfd, const void *msg, int len, int flags) int recv (int sockfd, void *buf, int len, unsigned int flags)
Bu fonksiyonlar isimlerinden de anlaşılacağı gibi veri gönderme ve alma işlerini yapar.” sockfd” üzerinden veri gönderilecek sokettir. “msg” gönderilmek istenen mesaj gösteren bir göstergedir ve “len”
değişkeni bu verinin byte cinsinden uzunluğudur. “flags” parametresi genelde o(sıfır) olarak kalır.


Kaynak: osmanmarangoz.wordpress.com
 Code isimli Üye şimdilik offline konumundadır   Alıntı

Yeni Konu   Cevap Yaz

Etiketler
programlama, socketsoket


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
C programlama ile ilgili kaynaklar! Entrance C ve C++ 2 29 Nisan 2017 18:50
C programlama diliyle basit kullanıcı ve şifre formu.. Entrance C ve C++ 0 03 Temmuz 2016 03:29
Mobil uygulama geliştiricilerinin en çok tercih ettiği 5 programlama dili Vesaire Mobil Programlama 0 03 Ağustos 2015 23:13
ios programlama için gerekenler Vesaire Mobil Programlama 0 03 Ağustos 2015 23:09
Mobil programlama için hangi programlama dili Vesaire Mobil Programlama 0 03 Ağustos 2015 23:07

irc hosting web hosting

Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.