
Kullanılan Teknolojiler
Proje Açıklaması
Bu proje, C++98 standartları kullanılarak geliştirilmiş, tam işlevsel bir IRC (Internet Relay Chat) sunucusudur. Projenin temel amacı; ağ programlama (socket programming), olay döngüsü (event loop) yönetimi ve IRC protokolü standartlarını (RFC 2812) kavramaktır.
Sunucu, poll() olay döngüsü sayesinde donmadan birden fazla istemcinin eş zamanlı bağlanmasına, kanallar oluşturmasına, mesajlaşmasına ve kanal yönetimi yapmasına olanak tanır.
- poll() olay döngüsü (event loop) ile bloklamayan (non-blocking) I/O yönetimi sağlandı.
- Soket programlama (socket, bind, listen, accept) aşamaları C++ ile kuruldu.
- Kanal modları (invite-only, şifreli, operatörlük, limit) ve kullanıcı yetkilendirmesi (KICK, INVITE) kodlandı.
README.md
FT_IRC - İnternet Aktarmalı Sohbet Sunucusu (IRC)
📌 Proje Hakkında
Bu proje, C++98 standartları kullanılarak geliştirilmiş, tam işlevsel bir IRC (Internet Relay Chat) sunucusudur. Projenin temel amacı, ağ programlama (socket programming), olay döngüsü (event loop) yönetimi ve IRC protokolü standartlarını (RFC 2812) kavramaktır.
Sunucu, birden fazla istemcinin eş zamanlı olarak bağlanmasına, kanallar oluşturmasına, mesajlaşmasına ve kanal yönetimi yapmasına olanak tanır.
🚀 Çalıştırma Talimatları
Derleme
Proje Makefile içerir. Derlemek için terminalde şu komutu çalıştırın:
make
Sunucuyu Başlatma
Sunucu bir port numarası ve bağlantı şifresi ile çalışır:
./ircserv <port> <şifre>
Örnek: ./ircserv 6667 sifre123
🌐 Bağlantı Seçenekleri ve Dış Erişim
Sunucuya hem yerel ağdan hem de farklı bilgisayarlardan bağlanabilirsiniz.
1. Yerel Bağlantı (Aynı Bilgisayar)
Kendi bilgisayarınızdan test etmek için:
- Terminal (nc):
nc localhost 6667 - HexChat / Irssi: Sunucu adresi olarak
127.0.0.1veyalocalhostkullanın.
2. Dış Bağlantı (Başka Bilgisayardan Bağlanma)
Başka bir bilgisayardan sizin sunucunuza bağlanmak için şu adımları izleyin:
- IP Adresinizi Öğrenin: Terminale
ipconfig(Windows) veyaifconfig(Linux/Mac) yazarak yerel IP adresinizi (örn:192.168.1.50) bulun. - Bağlantı Kurma: Diğer bilgisayardaki istemciye sizin IP adresinizi ve portunuzu girin.
- Örnek:
nc 192.168.1.50 6667
- Örnek:
- Güvenlik Duvarı: Eğer bağlantı kurulamazsa, bilgisayarınızın güvenlik duvarının (Firewall) seçtiğiniz porta izin verdiğinden emin olun.
3. HexChat ile Bağlanma (Görsel Arayüz)
HexChat gibi modern IRC istemcilerini kullanmak çok daha kolaydır. Eğer yüklü değilse (Linux için):
sudo apt install hexchat
Yükledikten sonra terminale hexchat yazarak uygulamayı başlatabilirsiniz.
Bağlantı Adımları:
- HexChat'i açın ve Network List (Ağ Listesi) ekranında Add diyerek yeni bir ağ ekleyin (örn: "BenimIRC").
- Edit butonuna basın ve sunucu adresi kısmına kendi IP'nizi ve portunuzu yazın (örn:
192.168.1.50/6667). - Password kısmına sunucuyu başlatırken belirlediğiniz şifreyi girin.
- Connect dediğinizde sunucuya bağlanmış olacaksınız.
🛠️ Teknik Altyapı ve Fonksiyonlar
Proje, düşük seviyeli sistem çağrılarını kullanarak verimli bir G/Ç yönetimi sağlar:
1. poll() (Olay Döngüsü)
Sunucunun kalbidir. Aynı anda hem yeni bağlantıları dinlemek hem de bağlı olan tüm istemcilerden gelen verileri takip etmek için kullanılır. select() fonksiyonuna göre daha modern ve esnektir.
- İşlevi: Dosya tanımlayıcılarındaki (file descriptors) olayları (okuma, yazma, hata) izler.
2. socket(), bind(), listen() ve accept()
socket(): İletişim için bir uç nokta (endpoint) oluşturur.bind(): Soketi belirli bir IP ve porta bağlar.listen(): Soketi gelen bağlantı isteklerini kabul edecek şekilde dinleme moduna alır.accept(): Gelen bir bağlantı isteğini kabul eder ve istemci ile iletişim kurmak için yeni bir dosya tanımlayıcı döner.
3. fcntl() ve O_NONBLOCK
Sunucunun donmasını (blocking) önlemek için tüm soketler non-blocking (bloklamayan) moda ayarlanır.
- İşlevi:
fcntl(fd, F_SETFL, O_NONBLOCK)komutu ile soketin veri gelmesini beklemeden işlem yapması sağlanır. Bu sayede bir istemci veri gönderirken sunucu diğer istemcilerle ilgilenmeye devam edebilir.
4. recv() ve send()
recv(): İstemciden gelen verileri okur.send(): Sunucunun istemciye yanıt veya mesaj iletmesini sağlar.
💬 Temel Komutlar ve Kullanım
Kullanıcıların sunucuda işlem yapabilmesi için kayıt olmaları gerekir.
Kayıt ve Giriş
- PASS: Sunucu şifresini doğrular.
- Kullanım:
PASS <şifre>
- Kullanım:
- NICK: Kullanıcı adı belirler.
- Kullanım:
NICK <takma_ad>
- Kullanım:
- USER: Kullanıcı detaylarını belirler.
- Kullanım:
USER <username> <hostname> <servername> <realname>
- Kullanım:
Kanal İşlemleri
- JOIN: Bir kanala katılır. Eğer kanal yoksa oluşturulur ve katılan ilk kişi Kanal Operatörü olur.
- Örnek:
JOIN #yazilim
- Örnek:
- PART: Kanaldan ayrılır.
- Örnek:
PART #yazilim
- Örnek:
- PRIVMSG: Bir kullanıcıya veya kanala mesaj gönderir.
- Örnek:
PRIVMSG #yazilim :Selam millet!
- Örnek:
- KICK: Bir kullanıcıyı kanaldan atar (Sadece operatörler).
- Örnek:
KICK #yazilim Ahmet :Kurallara uy!
- Örnek:
- INVITE: Bir kullanıcıyı davet eder.
- Örnek:
INVITE Mehmet #yazilim
- Örnek:
👑 Kanal Operatörü ve Modlar
Operatör Nasıl Olunur?
- Bir kanalı ilk oluşturan kişi otomatik olarak operatör (
@) olur. - Mevcut bir operatör,
MODEkomutu ile başka bir kullanıcıya operatörlük verebilir.
Kanal Modları (MODE)
Operatörler kanalı yönetmek için şu modları kullanabilir:
i(Invite-only): Sadece davet edilenler girebilir. (MODE #kanal +i)t(Topic protection): Sadece operatörler başlığı (topic) değiştirebilir. (MODE #kanal +t)k(Channel key): Kanala giriş için şifre koyar. (MODE #kanal +k <sifre>)o(Operator): Bir kullanıcıya operatörlük verir veya alır. (MODE #kanal +o <nick>)l(Limit): Kanala girebilecek maksimum kullanıcı sayısını belirler. (MODE #kanal +l 10)
📂 Proje Yapısı
src/: Kaynak kodlar (.cppdosyaları).inc/: Başlık dosyaları (.hppdosyaları).src/commands/: Her bir IRC komutunun (JOIN, NICK, vb.) ayrı ayrı implementasyonları.Makefile: Derleme kuralları.
Bu proje 42 okulu kapsamında eğitim amaçlı geliştirilmiştir.