PDA

Tam Sürümünü Görmek İçin : Socket programlama uygulaması (çorbanın tuzu eksik)


CrazyCat
06/08/2002, 19:01
Sanırım bütün forumlarda olduğu gibi en az ziyaret edilen bölüm burası :)

Messenger benzeri bi program yazmaya başladım. Ama tek başına sıkıcı oluyor. test ederken makineden makineye koşturmak bayağı yorucu :D

Böyle bir program (çorba) için katkıda bulunmak isteyen arkadaşlar varsa işi biraz daha eğlenceli(veya öğretici) hale getirebiliriz.

Programın sistem analizini yapmaya çalıştım ama araya giren işlerim yüzünden diyagramlar biraz karıştı. zaten olay sürüşlü bir mantık için düşünmüştüm ama ona göre en uygun model State event olduğunu düşünerek vaz caydım (ELH den gözüm korktu :D )

Sonuç olarak programı salla pati yapmaya başladım (Tam bana göre bir yöntem). programın iskeleti bitti ama kullanışlı hale getirilmesi için bir çok özellik eklenmesi gerekiyor.

Kısaca işlerinden vakit ayırıpta çorbada tuzunun olmasını isteyen arkadaşlar ile programın geliştirilmesi, denenmesi için fikir, zaman , iş gücü , kodlama vs için katkıda bulunmak isteyenler

bu işin nassıl olacağını burada tartışabiliriz.

Not: Programın sunucu kısmı için C++, Kullanıcı kısmı için ise Vb yada Delphi kullanmayı düşünüyordum, düşündüm ve aslında C++ ve Vb ile yazdım ama önerileriniz doğrultusunda değişebilir :rolleyes:

bi not daha: bir elin nesi var dört patisinde de pençesi var :D


Sahin
06/08/2002, 20:09
Bu ve bu tür bütün Türk yapimi programlara cani gönülden destek olurum kendä adima. Eminim ki arkadaslarimda benimle ayni düsüncededir. Yarin birgün ICQ'ya, Kazaa'ya suna buna rakip bir program ciktiginda corbada mutlaka www.ceviz.net inde tuzu olsun isteriz.

Kendi adima beta tester olabilirim ve bu konuyu her zaman üstte tutabilirim :)

Sevgiler...

RaiST
06/08/2002, 22:25
programların lisansı ne olacak?

ee++
06/08/2002, 22:58
Orjinal mesajı gönderen RaiST
programların lisansı ne olacak?

GPL harici herhangi bi sey :) Begendin mi? :)

Bu arada program icin yardimci olabilirim, en azindan fikir belirtebilirim (islerime bagli katki oranim).

Kolay gelsin.

RaiST
06/08/2002, 23:18
Orjinal mesajı gönderen ee++


GPL harici herhangi bi sey :) Begendin mi? :)

Bu arada program icin yardimci olabilirim, en azindan fikir belirtebilirim (islerime bagli katki oranim).

Kolay gelsin.

:P

begenmedim!!!

:D

hmustak
07/08/2002, 00:52
way be, 2 gün gidiyoz neler oluyo buralarda :=)

Beta Tester seve seve olurum, izmitte dolayısıyla nette olduğum sürece.
Şu bana gönderdiğin client/server lar la bi ilgisi varmı projenin?

CrazyCat
07/08/2002, 12:57
Burası gece hareketleniyormuş demek :)

Öncelikle yardım teklifleriniz için çok saolun. Eğer programı geliştirmeye çalışacak isek her türlü yardıma ihtiyacımız olacak.

Nasıl yardımlaşabileceğimizi tartışmadan önce biraz programdan bahsetmem lazım sanırım ama daha da önce bir kaç soruyu cevaplayayım .

Programın test edimesi çok önemli ama henüz tasarım aşamasında sayılır. Şu an için yazılmış olan kısmı sadece local network içinde test edilebilir. tam olarak internet üzerinde test edebilmek için tutarlı bir kullanıcı kayıt sistemi oluşturulması lazım.

RaiST: Lisans işini hiç düşünmemiştim o yüzden de bir tercihim yok ama eminim senin bu konudaki tecrüben bize ışık tutacaktır.

ee++ :Senin socket programlama ile ilgili olarak daha önce çalıştığını biliyorum. (bu konu ile ilgili ocal.netteki bütün eski msgleri okudum :) ) özellikle non-blocking ve thread ile ilgili konularda daha önceki deneyimlerine ihtiyacımız olacaktır.

hmustak : sana gönderdiğim client/server programları bu konudaki en temel örneklerden. Bu programda da o örneklerdeki gibi winsock kitaplığının temel fonksiyonları kullanılacak (Tabi daha ii bir altarnatif bulmassak)

şimdi eğer yardımcı olabilirseniz nasıl olabileceğiniz konusunu tartışmamız lazım ama önce program içün
nedenler?, niçinler? ve nasıllar? 'ı anlatmam lazım

Az sonra ... :D

CrazyCat
07/08/2002, 14:36
Yemek insanı biraz ağırlaştırıyormuş. Bişeler yazmak için parmaklarımı kımıldatmaya bile üşenir oldum. Bence bütün programcılar aç karnına kod yazmalı daha verimli olur :D

şimdi :

icq'simtrak bir program yazmak nereden icab etti (öncelikle programa bir isim bulunması lazım). ve neden yardımlaşmak gerekli?

1. Nedenler:

Genel:

* Tüm programcılar (program yazma işine gönül vermiş amatörler)
hayatlarının bir döneminde C/C++ gibi alt düzey programlama dillerine yada Java gibi güncel dillere merak sardıklarından araştırmaya başlarlar. şimdilerde forumlarda bir çok sorular görüyorsunuzdur:
- C nasıl öğrenilir? nerde kullanılır kitap ne alayım?
- C ile C++ nin fakı nedir?
- Java ile motorsiklet arasındaki ilişki nedir vs vs..
ama bir süre sonra aynı insanlarla bir daha karşılaşmazsınız.

kendimce sebepleri yetersiz kaynak ve öğretici olmayan örneklerdir.

* çoğu zaman da donanımla ilgili programlar ilgi çekici olmuştur. bir çok örnek indirilir fakat bir türlü çalışmaz, o örnek ve o örneğin yazıldığı dilden nefret edilir (aslında nefret de bir tür hayranlık ifadesidir) ve zamanla bazı diller tabulaşmaya başlar insanlar kendilerine yöneltilen ve nasıl yapıldığını bilmediği sorulara ortak cevaplar verirler " o iş için C kullanmak gerekir " gibi.

Bana göre bunun da sebepleri öğretici olmayan örneklerdir. mutlaka karşılaşmıssınızdır bir program kodu indirirsiniz açıklamalarını da okursunuz ama çalışmaz. Çünkü o kodu yazanlar nerden bulunacağı muamma olan bir kitaplık kullanmışlardır ve babalarının derleyicisiyle derlemişlerdir :D

* internet ortamında öğretici ve ilginç olan örenekler çoğunlukla dil problemleri yüzünden türkiyede programcılık öğrenmek isteyen meraklılar için yeterince öğretici olmamaktadır.

* Bu tür konularda bulunan örnekler hakkında yazan kişi veya gruba birşeyler sormak isterseniz çoğunlukla bulamazsınız bulsanız bili aynı dili konuşmadığınızdan sorunlar çıkar. bu nedenle forum ortamları proje geliştirmek için daha iyidir. ve internette geliştirilen bir çok projenin kendi forumu vardır.

* Öğrenmek için kitaplar konusu ise daha ilginçtir: standart seviyelerin üzerinde özel konularda yazılmış kitap çok azdır varsa ingilizcedir. türkçeye çevirilince kötü olur. türkçe yazılan kitaplarda ne yazık ki iğrençtir (bence bu konunun ivedilikle tartışılması lazım).

Özel:

- neden böyle bir program yazmaya kalkıştık ve neden yardımlaşmaya ihtiyaç duyuldu. ?

* Öncelikle profesyonel anlamda programcılığı bırakalı yaklaşık 9 yıl falan oldu bu sebeple uzun süredir örnekler hariç ciddi kodlar yazamıştım. (paslanma korkusu sardı) Ara sıra çok ihtiyaç duyulduğunda program yazıyorum ama tembel işi oluyor yani minumum kod ve maksimum işlem için hazır programları kullanıyorum.
en son ders üçretleri bodrosu için Visual Basic , Excel ve PHP de de bir program yazdım ( ilginç bir üçlü oldu sanırım :) ) oda işin büyük bir kısmını excel veri tabanı ve tabloları hallediyordu.

* hatır için socket programı yazma sözü verdiğimde çalışan bir örneği bulmak benim 5 günümü aldı ve o sırada çalışmayan örneklerdeki yetersiz açıklamaya saydıklarımı hiç kimsenin söylemesine gerek bırakmayacak bir örnek yazayım diye kendimi inandırdım.

* tek başına program yazmak programın gelişim sürecini çıkmaza soktuğuna inanıyorum. ( bir süre sonra yapılması gerekenleri bırakıp yapabildiklerinize yönelmeye başlıyorsunuz )

1. Sonuç olarak genel ve özel nedenlerden dolayı program için şunlara karar verdim

- Kullanıcı kadar yeni programcıların da ilgisini çeken çalışır bir kod yazma ihitiyacı vardır.

- Yazılan programın öğretici olması gereklidir ve standartlara yakın bir kitaplıklar kullanmalıdır.

- Yeni programcıların en çok merak ettiği bir çok kişi tarafından tabulaştırılmış C/C++ dilidir. bu yüzden program gurup çalışmasına da uygunluğu açısından C++ ile yazılmalıdır.

- her kesin kaynak kodlarını çalıştırabilmesi ve anlayabilmesi için ANSI C++ standartlrında yazılırsa ii olur

- socket programları hem kullanıcı hemde programcı tarafından ilgi çekici bir program örneği teşkil eder.

- Programın geliştirilebilir, tutarlı ve güvenilir olması için bir ekip tarafından yazılması ve test edilmesi daha faydalıdır.

- forumlar proje geliştirmek ve daha sonra destek vermek için uygun ortamlardır.

- bu projeyi geliştirilmesini teklif etme ve gelişimi aşamasında yardım etmek bana çok şey kazandıracaktır. (en azından hepinizden öğreneceğim çok şey var)



Sanırım şimdilik bu kadar. Nasılları? birazdan ... :rolleyes:

RaiST
07/08/2002, 14:49
crazy calıstıgın platform windows sanırım.. ? kod orneklerı bulamamaktan bahsetmmıssın

RaiST
07/08/2002, 15:11
merhaba.

ön not:
bu mesaj bu proje ile ilgili yıkıcı bir elestri olmak yerıne yapıcı olarak yazılmıstır.. mesaj forumda ki kımseye yonelık degil, genel bir mesajdır.

mesajı sımdıye kadar kendı deneyimlerime yazıyorum..

int. ortamında birbirlerini gormeyen gonulluler tarafından gelıstırılen projeler genelde cok atesli olur.. helekı turk projeleri.
bu projeler eger serbest yazılım ise veyada programcılar , ticari bi kazanc elde etmicekse , yurutulmesi zor bir istir..

bircok insan hemen bu turlu projelerde yardım etmek istedigini belirtir ama genellıkle sonuc soyledir: projeyi baslatan kısılerin cabalarıyla devam eder..

bizim ulesh projesi aynı dorultıda olmustur. 100'un üzerinde yardım basvurusu icinden yaklasık 15 kısı secilmis ve projeye baslanmıstır.. ne acıdır ki proje iptal edildiginde sadece 2 kisi kod yazmıstır.. x-frequency ve ben.. projemizde grafiker arkadaslarımız uzerlerine dusenı yapsalarda programcı arkadaslar genelde projeye girdikleri gunden sonra herhangi bir koz vs yazmadı..

sonucta enginle iptal etmek zorunda kaldık..

arianne adlı bir open source game engine projesinde gorev aldım / devam ediyorum.. proje finlandiya kaynaklı v 100'un uzerinde gonullu insan var.. yaklasık bir 30 kisi aktif rol alıyor..
arianne.cx adresine bakabilirsiniz.. bu proje her nekadar isi goturmus gibi gorunsede bu projenin yurumusedi projeyi baslata miguel adlı arkadasa baglıdır.. su anda kendisi toplam yazılan kodun %80 nin sahibidir.. goruldugu gibi insanlar boyle projeler hemen atlasalarda gerisi gelmez.. proje yine baslatanların uzerine kalır..

burda demek istedigim boyle bir projeye girilmeden once enine boyuna dusunulmeli incelenmeli, yardım etmek isteyen herkes kendi kendıne yardım edip edemeyecegini incelemelidir. daha sonra ise ne kadar yardımcı olacakları vs projeyi baslatana anlatmalıdırki ilerde sorunlar cıkmasın...

arkadaslar eger boyle bir projeye baslanacaksa , detaylı konusulması gerekir.. 1gunde hadi baslayalım gibi birsey mantıksızdır..

not: dedigim gibi bu yazının amacı yapıcı olmaktır. crazynın projesini kotuleme, "bu projeyi yapmayın " demek gibi bir amacım yok...

CrazyCat
07/08/2002, 19:16
Raist:
yazdıklarında haklı olduğunu bildiğimi söylemekten utanıyorum. Grup çalışalarında bir çok kişinin deneyimleri benzerlik gösterir. :confused:

Hatta bizraz daha ileri giderek şunu söyleyeyim iyi arkadaşlarınla aranı açmanın en kolay yolu birlikte iş yapmaktır.

Fakat çözümsüz değildir. Bu tür başarısızlıkların sebepleri vardır. Kökenine inilirse iyi bir planlama ile aşılır.

Proje için amaçları yazmıştım o çerçeveden bakarak bir kapsam oluşturmak gerekirse durum iç açıcı olabilir. Adımları küçük tutmak bazı sorunların ortaya çıkmasını engeller.

Yine amaçları göz önünde tutarak projedeki temel esasın çalışır, geliştirilebilir ve öğretici bir kod yazmak olduğunu düşünürsek bir sonraki adım çok küçük olacaktır dolayısıyla insanların katkıları daha sonraki adım için "fikir" içerikli olması muhtemeldir. Buda işi zevkli ve yorucu olmayan bir hale getirir.

sonunda oluşacak sadece bir çorba :) her kesin fikri bilgisi tecrübesi ve el emeği bir katkıdır. ve çeşit çoğaldıkça çorba besleyici olur.

benim umudum öğretici olması bıraktığımız noktadan birileri devam edebilir olması ve çokda aartılmadan dökümante edilebilmesi.

Tabi öğretici olacak bir şey için çk da komplex teknikler kullanılması gereksizdir bu da işi kolaylaştırır.

Basit bir antreman küçük bir iyi niyet gösterisi ve eğlenceli bir tartışma ortamı bir çok kişiye yeterince bilgi kazandıracaktır.

eğer senkronize çalışma ve takım ruhu gibi (bize uzak ) kavramlar yakalanırsa Kapsam geişletilip ciddi projeler üzerinde çalışılabilinir.

[Şahsi kanaatim]
tanıdığım (yada uzaktan izlediğim) insanlar ortalamanın çok üstünde yetenekli fakat olması gerektiğinden daha az verimli (çok fazla ürün yok)

Toplumsal olarak pesimist bir yapıda olduğumuzu kabullenmek gerekiyor sanırım ama bunun için kendimizi veya başkalarını suçlamak da karamsarlığı pekiştirir sadece

[/şahsi kanaatim]


Bir son nokta: çorba sadece birkaç kepçe çok büyük düşünmeyin çünkü tadımlık amacımız mirablis'e rakip olmak değil piyasadakilerden daha kapsamlı socket programlama örneği yazmak :D

Hiçbirşey son değilmiş demek :D :
gözümden kaçmış , ewt windows platformunda çalışıyorum ve bulduğum socket örneklerinin %80 i linux içindi. odamda redhat yüklü bir makine de var ama ağda deneme yapacağım diğer makinelerin %80 i windows olduğu için windows platformunu seçtim. (olay sadece demokratik :D )

Sahin
07/08/2002, 20:55
Bu konuyu takipteyim! Aksam dusuncelerimi toparlayip yazacagim arkadaslar.

ee++
07/08/2002, 23:42
Selam,

Once biraz paylasim :) :

Bugun Windows 2000 + SP3 kurdum. Siddetle tavsiye edilir. MS, tekel meseleleri dogrultusunda bir dizi degisiklik yapmis (IE'yi kaldirdim mesela :) ), tabi guvenlik onlemleri de cabasi. Bir de CD-ROM sürücüm arızalandı, bu baya sıkıcı.

Kisisel haberlerden sonra sadede gelelim:


Platform olarak Win ve Lin tercihimdir (Platform bagimsiz gibi de dusunulebilir).
Bu is icin gerekli sinif kitapligini BSD Socket ve Pthread kutuphanelerini kullanarak olusturabiliriz ve platformdan bagimsizligi ve guzel bir arayuzu (API) saglamis oluruz. (Win32 demeyin lutfen.) (.NET veya JAVA dicem ama performans sorunu olur.)
Bu tur projelerin hep bir hevesle basladigi ve husranla bittigi mukakkak. Boyle sayisiz proje gordum. Diyelim ki bu da oyle, nolucak yani.. Vakit gecer, 'mutlaka' bir seyler ogrenilir az da olsa (bu baya onemli).


Su an icin aklima bunlar geldi. Daha cok sey soylenebilir elbet...

Sahin
07/08/2002, 23:52
Genel kanı net üstünde tanışan insanlarla başlayan bu projenin yürümeyeceği üzerinde. İlk önce bunun yanlış olduğunu kanıtlamamız lazım.

Mesela bizim oluşumda daha yüzyüze birbirini görmüş kimse yok ama her geçen gün daha candan daha istekli görüyorum arkadaşları. Es kaza arkadaşlardan biri yada bir kaçı ayrılmak istese guruptan ne olur? Yazdıkları geriye kar kalır, kendisi için çok büyük bilgi birikimi ve tecrübe edinmiş olur, sürekli olarak bu yazılardan faydalanma imkanı olur. Daha pekçok fayda sayabilirim.

İyi bir organize ve ortaya çıkan küçükte olsa "bir şey" ile çok daha hevesli çalışmalar olacağından eminim ben.

Ortaya çıkan çok küçük şey. Evet ortaya küçük çok az fonksiyonu kullanılır halde bile olsa çalışır birşeyler çıkarmak ve bunun üzerinden gitmek daha etkili olur. Çalışan programı gören arkadaşlar daha bir istekli sarılacaklardır projeye.

Neden olmasın? Zaten çogu bu tip program yazan insanların yaşları 16-26 arası. Yaşında hiçbir önemi yok ne eksigimiz var ki yapamayalım?

Organize işini üstlenirim "dünya kadar işimin arasında" eğer isterseniz. Yeterki ortaya bir an önce çalışır bir program çıkaralım ve onu geliştirelim.

İsim olarak önerim "Ceviz Messenger".

Sevgiler...

RaiST
08/08/2002, 00:45
Orjinal mesajı gönderen ee++
Selam,

Platform olarak Win ve Lin tercihimdir (Platform bagimsiz gibi de dusunulebilir).
Bu is icin gerekli sinif kitapligini BSD Socket ve Pthread kutuphanelerini kullanarak olusturabiliriz ve platformdan bagimsizligi ve guzel bir arayuzu (API) saglamis oluruz. (Win32 demeyin lutfen.) (.NET veya JAVA dicem ama performans sorunu olur.)


Su an icin aklima bunlar geldi. Daha cok sey soylenebilir elbet...

benımde 1-2 onerım var:

eger multiplatform bir sockets arabirimi yazılcaksa ee++ye katılıyorum yok ama varolan bir arabirim kullancaksak:

cok basit bir multiplatform sockets arabirim kullanılan SDL_Net kullanılabilir.. ornekleri cok iyi ve dokumantasyonuda yeterli..

ee++
08/08/2002, 00:50
Orjinal mesajı gönderen RaiST

eger multiplatform bir sockets arabirimi yazılcaksa ee++ye katılıyorum yok ama varolan bir arabirim kullancaksak:

cok basit bir multiplatform sockets arabirim kullanılan SDL_Net kullanılabilir.. ornekleri cok iyi ve dokumantasyonuda yeterli..

Simdi aricam ama su SDL_net ile yazilmis iyi bir kac uygulama gorebilir miyiz? Kucuk olsun bi zahmet.

Kolay gelsin.

RaiST
08/08/2002, 00:59
sdl_net aslında sdl libin bir alt sınıfı..

sdl= simple directmedia library..

oyun programcıları icin buyuk kolaylıklar sagliyor..
sdl_net onun bir alt sınıfı ama becerekli ve basit..

http://www.libsdl.org/projects/SDL_net/

source codeu cekınce yanında basit ornekler geliyor..

buda documentation
http://jcatki.no-ip.org/SDL_net/

belki tam olarak isimizede yaramayabilir cok basit kalabilir ama yinede bir alternatif..

ee++
08/08/2002, 01:04
O adreslere gittim ve zaten inceledim. Bana pek profesyonel gelmedi. BSD Socket islevlerinin basina SDLNet eklemis adam.. :)

Ama kullanılabilir tabi, dert değil. Bir oneri olarak, surada (http://www.glnetsoftware.com/datareel/docs/classes/classes.htm) bir kitaplik var. Ben yine de basit bir cevizNET kutuphanesinden yanayim :)

Kolay gelsin.

RaiST
08/08/2002, 01:12
Orjinal mesajı gönderen ee++
O adreslere gittim ve zaten inceledim. Bana pek profesyonel gelmedi. BSD Socket islevlerinin basina SDLNet eklemis adam.. :)

Ama kullanılabilir tabi, dert değil. Bir oneri olarak, surada (http://www.glnetsoftware.com/datareel/docs/classes/classes.htm) bir kitaplik var. Ben yine de basit bir cevizNET kutuphanesinden yanayim :)

Kolay gelsin.

hımm ewt haklısın..

ve bazı durumlarda ise cok basit kaciyor..

aslinda varya cevizNET olayı gercekten benımde aklıma yatıyo.. cunki hernekadar bircok lib. olsada mukemmel yakın bisi bulmak zor..

biri cok basit kaciyor ama dokumanı iyi
biri cok iyi her ise yariyo ama ne ornek ne dokuman vs vs..

cevizNET libs :)

ee++
08/08/2002, 01:20
Tabi bu arada benim cevizNET'ten kastim sadece ust duzey ve bu projeye yonelik bir kitaplik. (Tabi ki baska projelerde de kullanilabilir olmali, iyi tasarlanmali, moduler filan..)

cevizNET_accept ya da cevizNET_listen islevlerini yazacak halimiz yok ama ornegin C++ ile guzel bir istemci/sunucu yaratma, mesajlasma, vs islerini yapan kitapliklar olusturulabilir, cevizNET_TCPServer, cevizNET_TCPServer::SendMessage() gibi.. Tekrar soyluyorum, bunlar BSD Socket API ile yapilabilir sanirim. Yani basit socket, listen, bind, send, revc islevleri ile. Bu sekilde yazilirsa da her platformda derlenir sorun olmadan (ya da cok az degisiklikle).

cevizNET::cevizNET_start() :)

RaiST
08/08/2002, 01:26
Orjinal mesajı gönderen ee++
, cevizNET_TCPServer, cevizNET_TCPServer::SendMessage()



walla acaip ise yarar

CrazyCat
08/08/2002, 12:27
Burası gerçekten gece hızlanıyormuş :rolleyes:

Ortaya hakikatten güzel fikirler çıkabiliyormuş demek :)
BSD socket için farklı bir arayüz yazmak ilginç bir fikir yeni kitaplık iyi dökümante edilebilirse yerli programcıların işine oldukça yarayabilir. Aynı zamanda multi platform için biraz daha uygun hele getirmek amacıyla linuxda da derlenebilen bir server programı yazılabilir. Sistem winx ise arka planda farkli kitaplıklar kullanılır linux ise farklı ama aynı arayüz ikisi içinde geçerli olur. Biraz karışık olur ama sanırım tam anlamı ile dual platform olur :)

tabi biraz iş yapılması gerekir emekle ürünün kalitesi doğru orantılıdır.
---------

Program için kullanışlı bir mantık bulmak amacıyla küçük denemeler yapmıştım. Şu anda çalışır ve çok basit bir yöntemim var ama biraz salla pati :)

bence öncelikle kullanılacak yöntem konusunda bir çıkar yol bulmalıyız.

yani problemi tanıyalım. Analiz edelim. Sonra parçalara ayırıp çözelim ve inşa edelim. Sonra test ederek uygulamaya koyarız. Sanırım doğru olanı da bu.

Şimdi biraz benim kullandığım basit ama en azından çalışır çözümüm nasıl ondan bahsedeyim. siz yöntem konusunda daha iyi fikirler üretebilirsiniz.

Ağ ortamında deneme imkanım olduğu için kullanıcı ile server arasında sürekli bri bağlantı gerektirmeyen basit bir mantık oluşturmaya çalıştım durum şöyle:

server için iki küçük program parçası yazdım. (yanlız olduğum için aynı anda test etme imkanım yoktu)

birinci program belli bir portu sürekli dinlemeye alıyor.
istemciden bağlantı isteği gelince bağlantıyı sağlayıp mesajı alıyor.
sonra mesajı bir kuyruk dosyasına belli bir yapıda yazıyor
bağlantıyı kesip tekrar dinlemeye başlıyor.

ikinci program parçası ise kuyruk dosyasını kontrol ediyor dolu ise mesajı alıyor.
belli formatta olan mesajı parse edip mesaj nesnesine atıyor.
ve dinlemede olan alıcıya belli bir porttan bağlanıp gönderiyor.
mesaj gönderimi başarısız olursa birkaç denemeden sonra vaz geçiyor.
başarılı giden mesajları siliyor. gidemeyenler bir sonraki kontrole kalıyor.
dağıtım işlemi bitince tekrar kuyruk dosyasını kontrol etmeye başlıyor

server kısmı bu kadar oldukça basit iki program parçası ama tabiki bir çok özelliğin eklenmesi ve hataların denetim altına alınması gerekiyor. tabi birde tak bir program ve multi thread yapıya sahip olaması daha iyi olur.

benim denemelerimdeki en önemli sorun server programı çok hzılı çalıştığı için kullanıcılara giden msgler bazen kullanıcıda hataya yol açıyor ve nadiren de olsa msg kaybı oluyor.


kullanıcı kısmı ise yine oldukça basit:

kullanıcı programı çalışır durumdayken bir portu sürekli dinliyor.
mesaj gelirse kullanıcıyı uyarıyor ve mesajları bir tampon dosyada biriktiriyor.

kullanıcı gelen msgleri okuduktan sonra siliyor.

eğer kullanıcı kendinde kayıtlı bir diğer kullanıcıya mesaj göndermek isterse (ki kullanıcı kaydı kısmı şimdilik ağdaki makine isimleri ve sabit :) ) ilgili kullanıcıya mesaj göndermek için bir pencere açıyor girilen mesaj gönder tuşuna basılınca sırasıyla:
dinleme kesiliyor.
serverdaki dinlene porta bağlanılıyor
mesaj gönderiliyor.
mesaj gönderilince bağlantı kesilip dinlemeye devam ediliyor.

giden msg gönderen ve alıcı ismi içerdiği için serverdaki dağıtıcı program bunları kolaylıkla parse edip gerekli yerlere tekrar dağıtıyor..

------
biraz karışık anlattım sanırım ama tek başına program yazmanın en kötü tarafı programda kafanız kadar karışık oluyor. Ve tabi burdaki çözümlerin hepsi biraz salla pati :D
ama iyi yandan bakılırsa çalışıyor ve iş görüyor (eh biraz eksikleri var tabi)
:rolleyes:

ee++
08/08/2002, 13:31
Selam,

CrazyCat, su senin ufak denemeyi bi alabilir miyiz? Eger mumkunse bir yerlere yuklersen iyi olur.

Kolay gelsin.

CrazyCat
08/08/2002, 16:12
merhabalar :)

dosyalar biyerlere yükledim :) şurdan (http://www.adanamyo.net/download/MyMessenger.zip) alabilirsin..

aralara biraz açıklama yazdım ama zaten çok büyük dosyalar diil ve kolay anlaşılır.

kullanacılar için hazırladığım program aceleye geldiği için biraz basit kaçtı. (ama acil deneme yapmam lazımdı) kullanıcı isimlerini forma sabit ekledim onların yerine bulunduğun ağdaki makine isimlerini girsen yeterli.

zaten biraz bakınca herşey sırıtıyor :D

kolay gelsin :)

ee++
08/08/2002, 17:42
@CrazyCat, tamam abicim programın Enterprise olmasını beklemiyoruz zaten :) Şöyle bi bakalım dedik :) Şimdi bakıcam, ama zaten VB'den bir puan kaybettin :)

ee++
08/08/2002, 21:30
Selam,

(Lutfen hic bir yazdigim ukalalik, hiyarlik, vs seklinde algilanmasin, ogrenmek, ogretmek icin buradayiz.)

Kodu (sadece sunucu kodunu, derlemeden) inceledim biraz. Oldukça basit. Zaten BSD API yogun kullanilmis, ben de bunu diyordum. Ancak cok ciddi eksikler var. Bu ornek ne yazik ki tek kullanicili bir sistem gibi calisiyor ki bir chat server icin bu anlamsiz. listenSocket'i bir while icinde tekrar tekrar yaratmak katliam sayilabilir. while dongusu icinde olmasi gereken sadece accept() ve genel kani olarak da her accept()'ten sonra bir thread ya da gorev (process) yaratilir (unix'te exec* ile) ve bu thread ya da process artik o istemci ile ilgilenmeye baslar. Tabi bir chat server icin mimari biraz daha farkli olabilir.

Bu sadece bir kac dakikalik bir inceleme sonucu, ayrintili olarak bir kac kisi daha bi seyler soyleyince konusuruz.

(Not: Dil icin kusura bakmayin. Bilenler bilir ben neredeyse hic yabanci kelime kullanmam ve kendimi de bu sekilde yazarken hic kasmam, zaten gunluk konusmam oyledir; ama cogu kisi anlamadigi ya da tepki gosterdigi icin bu sekilde tarzanca yaziyorum. Bu parantez ici not hakkinda bir yorum yapilmasin lutfen.)

Kolay gelsin.

CrazyCat
09/08/2002, 10:47
Sana büyük bir zevkle kocaman bir haklısın diyorum :)

Tek başına bir program yazmanın en tuhaf yanı da budur aslında bir çok şey olması gerektiği gibi değilde yapabildiğin gibi olur.

Tabi program yazmaktan kastım kodlamak değil daha çok sistem geliştirmek.

Eğer iyi bir planlama olur sistem geliştirme süreçleri olması gerektiği gibi bir ekip tarafından analiz edilir ve daha sonra fonksiyon hiyerarşisi belirlenip program parçalara ayırılırsa ozaman tek başına yada ayrı ayrı kişiler tarafından kodlar yazılabilinir gerekirse optimize etmek için kodlar takas edilebilir.

bu program için ise sunucu mantığının iyi planlanması gerkiyor. basitlik en iyi sonuca ulaştırır ama kodların esnekliği ve güvenirliği tamamen tasarıma bağlıdır.

gönderdiğim sunucu programının istemci ile ilişkisi tek bir işleve bağlı olduğu için lineer bir akışı var ve bu konudaki temel örneklerden bir farkı yok. O tuhaf kaçan While döngüsü ise programı göndermek için son anda eklenmişti :) Çünkü benim buradaki denemelerimde programın sürekli dinlemede kalmasına gerek kalmamıştı çünkü mesajı atanda tutanda bendim :D

Thread konusunda haklısın olması gereken de bu sanırım. Ama eğer socket fonsiyonlari için yeni arayüz yazılacaksa nesnel bir yapıya çevirilmesi daha iyi olacaktır sanırım. ozaman yine basit thread da eklenerek program şimdiki halinden çok daha kısa kodlara sahip olarak çok daha işlevsel olabilir. Tabi Win için Nasıl yeni bir Thread oluşturulacağına dair bir kaç stabil örneğe ihtiyaç var sanırım sende vardır :)

bir son nokta programı incelediğin için saol :)

Sahin
09/08/2002, 17:09
Takipteyim...

ee++
09/08/2002, 18:07
Selam,

Program geliştirmek bir ekip işidir. Her ne kadar bunu çok tecrübe etmesem de doğruluğu kesin, tasarım ve hata ayıklama aşamalarında çok yararlıdır (ve gereklidir). Burada bir ekip ruhu olduguna gore bu sorunu aşmış bulunuyoruz. :)

Kanımca yapılması gerekenler:


Thread, Socket, Stream gibi bir kaç temel (ve kazık) konuda bilgi sahibi olunmalı.
Dil, Platform ve kullanılabilecek teknolojiler (xml) hakkında karara varılmalı.
Gerekiyorsa hazır araçlar ve kütüphaneler edinilmeli.
Gerekiyorsa bir kütüphane oluşturulmalı. Nesneye Yönelik imkanlar sunması tercih edilir.
Programın ana işlevi (görevi) ve alt bölümleri (dosya gönderme) gibi düşünülmeli.
Programın sunucu ve istemci yapısı, programa özel protokol tasarlanmalı.
ve şu an aklıma gelmeyen bir çok şey ve Kodlama tabi.


Bunların yanında dil ve platform olarak Java ya da C# (.NET) öneriyorum. Çünkü yukarıda da bahsettiğim bazı temel kavramlar bu dil/platromlarda oldukça gelişmiş yapılarla ifade ediliyor ve koddan ve hata ayıklama zahmetinden de oldukça tasarruf sağlanıyor. Performans konusunda bir şey söyleyemem. Tabi saf C veya C++ ile programlamanın da zevki başka.. :) Nasıl isterseniz...

(CrazyCat, bu arada Win32'de Thread oluşturmak için beginThread() ve CreateThread fonksiyonları var, daha başkaları da var ve hepsi 30 tane filan parametre alıyor :) İğrenç şey.. :) )

RaiST
11/08/2002, 12:35
Orjinal mesajı gönderen ee++
(CrazyCat, bu arada Win32'de Thread oluşturmak için beginThread() ve CreateThread fonksiyonları var, daha başkaları da var ve hepsi 30 tane filan parametre alıyor :) İğrenç şey.. :) )

onbeşbinyediyüzseksendokuz tane parametre alıyorlar!!!

ahah fork gibisi yok

CrazyCat
11/08/2002, 14:27
(CrazyCat, bu arada Win32'de Thread oluşturmak için beginThread() ve CreateThread fonksiyonları var, daha başkaları da var ve hepsi 30 tane filan parametre alıyor İğrenç şey.. )

Thread işini biraz incelemiştim ama pek aklıma yatmadı bazı fonksiyonları bir ara yüzle biraz basitleştirilirse sanırım çok fazla karmaşaya gerek kalmadan kullanılabilir. Zaten çok yoğun kullanımına gerek kalmayacak bir tasarım yapmaya çalışmalıyız diye düşünüyordum. (msg leri bir kuyrukta biriktirip dağıtmayı onun için düşündüm.)

zaten gönderdiğim uygulamada kullanıcılar sunucuya sürekli bağlı değiller terminaler ise karşılıklı olarak birbirlerinin durumundan habersizler. Belki Çok doğru bir mantık değil bir sürü dezavantajı var (başarısız msglerin kuyrukta birikmesi gibi) ama küçük bir ağ için biraz hata kontrolü ile düzenlenebilir bir yapı.

Tabi netteki uygulamalara bakılınca (icq ve messenger gibi) durum çok daha farklı örneğin icq için istemci sunucuya bir çok porttan sürekli/periyodik olarak bağlı böylece karşılıklı durum kontrolü gerçekleşebiliyor.

programlama dili içinde iyi bir analiz yapmak lazım. Sunucu işlemleri çok komplex yapıya sahip olmadığı sürece biraz planlama ve iş bölümü ile C++ de yazılabilir iyi bir örnek de olmuş olur.

Kullanıcı kısmı için ise oldukça düşünmek lazım. iyi bir avantajlar tablosu çıkarmakta fayda var.

Şunları gözardı etmemek lazım:

- Kullanıcı programının görsel bir arayüzü olmalı. Görsel bir programlama dili kullanılırsa genelde olay sürüşlü bir programlama mantığı yürütmek lazım. olay sürüşlü bir programlama için sistem analizi ve durum değerlendirmesi yapmak biraz daha kolaydır. çünkü nesnelerin sahip olduğu yöntemler ve özellikler hazır gelir.

burda altarnatif olarak.
* Visual C++
* C++ Builder
* Java
* C#
* Delphi
* Visual Basic

Dilleri var (tabi birde C++ ve Win32 var ama listeye almak bile istemedim :) )

Dil seçiminde dikkat etmemiz gereken hususlar ise şunlar olmalı:

- İyi Dökümantasyon (özellikle socket uygulamaları için)
- hızlılık (yaptığım VB uygulaması serverin hızına yetişmediği için bazen hata veriyordu)
- Kolay uygulama geliştirilebilmesi
- Projeye yardımcı olacak kişilerce yaygın olarak bilinmesi
- Birde şu an aklıma gelmeyen (sizin ekleyebilecekleriniz)

Bence bütün kriterler bir liste haline getirilip puanlanması gerekir.

Kendi düşüncelerim ise şunlar:

- Visual C++ oldukça karışık ve kitaplıklarının tasarımı bir çok kişi tarafından eleştiriliyor. birde ben hiç ısınamadım :)

- C++ Builderi yeterince ciddi bulmuyorum (nedenini de bilmiyorum ama bir kaç uygulama yapmıştım hiç de zevk vermedi)

- Java nın platform bağımsızlığı gibi bir avantajı var görsel arayüz kolay oluşturuluyor ama birkaç basit örnek dışında hiç uygulama geliştirmedim. Gördüğüm kadarı ile de biraz yavaş.

- C# ı şu an inceliyorum C++ye göre oldukça kolay birde Grafik kullanıcı arayüzü oluşturmak Visual C ye göre çok daha kolay. Fakat socket uygulaması için elimde hiç örnek yok sadece birkaç tane e-kitap var. Kısa sürede öğrenebilirim gibi geliyor Visual C# pı bulup biraz deneme yapmam lazım. (bunu tartışabiliriz)

- Delphi oldukça optimal bir dil. Kolay anlaşılabilir hızlı ama benim fazla aram yok birkaç veritabanı uygulaması dışında hiç program yazmadım (işin doğrusu bu ara delphi ile de haşır neşir olmak istemem çünkü devam ettiğim programları da düşünecek olursam işlerim oldukça karışacaktır. - Şu an PHP de bir portal Vb de de ders ücreti bordrosu yazıyorum - )

- son olarak da VB kaldı :) en özenmli avantajı kolay ve hemen hemen herkes tarafından biliniyor olması. Dez avantajları Malum :D. Ama VB.Net de bu dezavantajların bir çoğunun bertaraf edildiği idda ediliyordu sanırım bu konuda deneyimi olan arkadaşlar birkaç şey söyler)

- Birde hiç düşünmediğimiz seçenek C++ ve Win32 var ama sanırım düşünmasek daha ii olur yanılıyor muyum?

eminim ekleyeceğiniz birşeyler vardır.

Bir de bu programın internet ortamındaki uygulama zorluğunu biliyorsunuzdur. (kimse serverinde exe bir program çalıştırılmasını istemeyebilir) bu nedenle intranet için yazıllıyormuş gibi başlanması daha doğru olur. Eğer ilk denemeler başarılı olursa ağdaki diğer platformlar için alternatifleri de yazılırsa yakışıklı olur.
(sanırım sunucu için pek bişey değişmeyecek ama kullanıcı programlarını Linux da yazmak için nasıl bir mantık/Programlama dili kullanılması gerektiğini hiç düşünmedim)

eminim eklemek istediğiniz bişeyler vardır.

iyi çalışmalar.

ee++
11/08/2002, 17:05
Selam,

Dil olarak C#'i oneriyorum.

Platform olarak, Windows'un yaninda, Linux'ta da Mono ile çalıştırılır.

Böylece bir kaç şey öğrenmiş oluruz.

Bu arada örnek sorun değil, her hangi bir konuda.


Bir de, neden hep istemci/sunucu yapisi dusunuluyor? Kullanici isimleri icin sunucu sart ama ya iletisim icin? p2p??? Olmaz mi? (Cok derin bilgim yok p2p hakkinda, ama cogu mesajlasma yazılımı bu yontemle yazılıyor).

Bunun disinda yine de herhangi bir dil-platform olabilir, avantajlarini ortaya koyarsaniz. Benim siralamam: C#, C, Java.

Kolay gelsin.

RaiST
12/08/2002, 19:19
@ee++
p2p server/clienta gore bariz olarak optimal bir sistemdir ama p2p sistemlerinin hazırlanısı cok zordur.. iyi analiz , planlama gerekir.. p2p sistemini kagıt uzerindeolustururken yaptıgınız kucuk bir hata herseye 0dan baslamanıza neden olabilir..

@crazy
threading olmazsa bu is olmaz..kuyruk mantıgı bir yere kadar gelir ve tıkanır

ayrıca demıssınkı kullanıcılar sunucuya surekli bagli degil.. bu durumda udp kullanmak daha mantıklı gibi

birde demissinki vb client sunucu hızına erisemiyor. bu sonuca nasıl ulastın anlamayamadım..

ayrica vb.net ,c# konusu geçmekte..
vb.net gerçekten bir programlama dili..
c# ise oda cok iyi ama bu platformlarda calısmaya baslamadan once hatırlanması gerekenbirsey: bu platformların frameworkleri hala bircok sistemde kurulu değil.. kullanıcıya buprogramı kullan demek icin git onlar mb dosya indir demek pek iyi birsey deil :)

CrazyCat
12/08/2002, 20:25
Merhabalar..

p2p yapisi kalabalik bir kullanıcı profili için işleri daha karıştırır diye düşünüyorum. Özellikle her iki tarafında online olma durumu göz önünde tutulması gerekli olur. Tabi offline msg göndermek isteyenler için ii olmaz. Planlanması ise gerçekten biraz karışık olabilir kaynakları ii kullanmak gerekir.

Bunlar tabi sadece dezavantajları.

Server için Raistin dediğine hak vermemek elde değil. Thread olmazsa bu kuyruk şişer ve kontrol için oldukça fazla durumu analiz etmek gerekir.

udp için de gözden kaçırılmaması gereken dez avantajlar yok değil.

aslında fonksiyonel bir mesanger için dezavantajlı saydığımız bütün bu yontemlere ihtiyaç duyulabileceğini de gözden kaçırmamak gerekir :)

ofline msg için kuyruk gereklidir..
istemciler arası chat tarzı bir msgleşmek için p2p en mantıklı seçenek. server aradan çıkmış olur (tabi güvenlik açıkları devreye girmiş olur :) )

sürekli bir bağlantı söz konusu olmayacaksa udp düşünülmesi gerekebilir. ama yukardaki fonksiyonlar düşünülcek ise kullanıcıların durumlarının bilinmesi için periodik çalışan bir kontrol algoritmasına ihtiyaç duyulur.

tabi butün bu işlevlerin doğrultusunda serverin sadece msg gönderen bir istemci için yazılmış server programı ile kıyaslandığı zaman çok daha fazla şey bilmesi gerekir. buda sunucu için yazılacak programın daha karışık bir yapıya sahip olmasını gerektirir.

Aslında düşünülecek ve eklenecek çok şey var fikirler vizyonu belirler. iyi bir planlama yapılırsa oluşturulacak mimarı eklenebilecek özellikler düşünülerek tasarlanır. ve tamel fonksiyonlar seçilerek ilk çalışır program elde edilebilir.

işin güzel tarafı alternatifleri düşünüp planlayacak kadar beyin gücü olması ekip çalışmasının en tatlı yönü de bu.

@Raist Vb client için elde ettiğim hız yetersizliği kanısı denemek için yazdığım vb client uygulamasını test ederken aldığım sonuçlardan ibaret. Sebebi hatalı tasarım olabilir. eğer kodları incelersen fark edebilirsin. eminim çözümsüz değildir.

C# ın taşınabilirlik problemlerini fark etmiştim benim için en büyük avantajı üzerinde çalışılması iyi olacak ve geleceği olan bir platform olması. Ama framework'ü çekerken çektiğim ızdırapları herkes yaşamak zorunda kalmak istmeyebilir.

Vb.net için ise senin bişeler söylemeni bekliyordum işin doğrusu :)
Visual studio.net i istedim sanırım kısa bir sürede edinmiş olurum ozaman incelersem sanırım beniimde bu konuda firim olmuş olur.

ama daha önce dediğim gibi iyi bir avantajlar/dezavantajlar tablosu oluşturulup karar verilmesi daha sağlıklı olur.

iyi çalışmalar

ee++
12/08/2002, 22:14
Evet ben yine bir dizi dusuncemi dile getireyim :) :


Istemci/Sunucu Mimarisi
.NET + C#
Multi-threaded Sunucu


VB.NET'i burada tartışmak istemiyorum ama benim feci şekilde visual basic antipatim vardır... :hmmm: Ortam .NET ise dil C#'tır, genel kural budur, istisnalar olabilir.

Raist, p2p ornekleri varsa adres verebilir misin? Tabi ki kaliteli bildigin varsa demek istiyorum, yoksa zaten internetin yarisi benim makinada.. :)

CrazyCat
13/08/2002, 18:32
-İstemci/Sunucu mimarisi ideal görünüyor.
-Multi-threaded sunucu programı kaçınılmaz.
- Aynı Zamanda Server için C++ düşünülelim
- Client için ise deneriz :)

Aslında başlangıç için iyi ortak noktalar :)

Öncelikle sunucu uygulamasını şekillendirebilirsek deneme amaçlı olarak bir kaç alternatif client programı yazılabilir daha sonra gerçek uygulamayı yazabiliriz.

İlk Adım olarak Sunucunun ne tür işlevlere sahip olması gerektiğini planlamamız lazım. Daha sonra bu işlevler Parçalara ayırılıarak yazılabilir.

Bana göre:

En temel işlev mesajları alıp dağıtması olduğuna göre bu kısımda nasıl bir fonksiyon hiyerarşisi kullanılacak ona karar vermek lazım.

Aklıma gelen Fonksiyon hiyerarşisi şöyle:

1.1 Server Bir portu dinlemeye başlar.
1.2 Bir bağlantı isteği gelince yeni bir threat oluşturur
1.3 dinlemeye devam eder :)

1.2.1 Mesaj kabul edilir.
1.2.2 Mesaj ayrıştırılarak mesaj nesnesi oluşturulur
1.2.3 Beklemede olan istemciye bağlanılır
1.2.3.1 Bağlantı sağlanırsa mesaj dizesi oluşturulup gönderilir.
1.2.3.2 Bağlantı sağlanamassa ön tanımlı değer kadar tekrarlanır.
1.2.3.3 tekrarlama başarısızsa mesaj dizesi kuyruğa kaydedilir.
1.2.4 Thread sonlandırılır.

ikinci bir program yada birinci programa (ek bir thread) ise

2.1. Ön tanımlı periodlarda kuyruğu kontrol eder.
2.2. kuyruk doluysa kuyruğu okumaya başlar
2.3. okunan mesaj için bir thread oluşturulur
2.3.1 - 1.2.2 fonksiyon çalışır
2.3.2 - 1.2.3 " "
2.3.3 - 1.2.3.1 " "
2.3.3.1 Mesaj Başarılı ise kuyruktan silinir
2.3.4 - 1.2.3.2 " "
2.3.5 - Kuyruk sonlandıysa thread sonlandırılır.

---
Biraz aceleyle oldu ama buna benzer bir fonksiyon hiyerarşisi kurulabilir. daha sonra nesneler ve veri aakışı planlanıp fonksiyonları kodlamaya başlayabiliriz.

Sizce uygun mu? msg iletimi için başka neler yapılabilir? yada farklı bişeler ?

Eğer Fonsiyon hiyerarşisini belirlersek tasarımın diğer aşamalarını hızlıca halledebiliriz. Hatta çok karmaşık modelleme detaylaylarına girilmemesinden taraftarım Kullanılan modelleme teknikleri arasındaki farklılıklar iletişimimizi aksatabilir.

iyi çalışmalar...

ee++
13/08/2002, 23:17
Iyi hos da, soyledigin mimari de her istemciye bir thread atiyorsun. 1000 istemci olunca ne olacak?

RaiST
14/08/2002, 13:29
1000 tane thread acarsak, makine threaded fonksiyonları calıstırmak yerine , sadece bir threaden digerine gecis hesaplamalarını yapmak icin overload calisir hehe :)

CrazyCat
14/08/2002, 17:40
1000 istemci aynı anda biraz ütopik bir rakam her bir thread görevini 1-2 saniye civarında gerçekleştireceğini düşünürsek 1000 kullanıcının aynı anda istemde bulunması için 10 binlerce kullanıcının online olması gerekir.

Olsun bir ihtimalde olsa düşünmekte fayda var.

Çözümsüz olmadığı kanaatindeyim.

Örneğin her Thread in sistem kaynaklarının ne kadarını kullandığını hesaplayarak belli bir bağlantı sınırı getirilebilir. istemci bekletilir. Zeten istemci de mesaj gönderirken belli bir periyodda denemeler yapması gerekli. (sanırım icq da da böyle bir gecikme süresi var süre aşılınca msg gönderilemedi gibi bir ibare beliriyordu)

Kullanıcılar saniyede onlarca msg yazamayacaklarına göre bir süre bekletildiklerinin farkına varmazlar :)

Tabiki farklı bir çözüm önerebilirsiniz. Thread konusunda hem fikir olduğuna göre yükü biraz azaltmak için demin bahsettiğim önlemin dışında farklı neler olabilir?



Bu arada istemci programı olmadan web tabanlı mesaj gönderebilmek için birkaç deneme scripti yazdım gayet başarılı çalışıyor. Bu konuda PHP nin socket fonksiyonları oldukça kullanışlı.

şöyle bir mantık düşünmüştüm:

Bir web sitesi aracılığı ile de istemci programlara server vasıtasıyla msg gönderilen bir uygulama eklenirse biraz daha işlevsel olur.

Sanırım böyle bir özellik icq da da vardı (emin konuşamıyorum çünkü yıllardır icq kullanmıyorum :( )

Denemem umduğumdan daha verimli oldu.
Bu bana aynı şekilde sunucu uygulamasının da PHP ile yazılabileceği fikrini verdi (geceleri uyuyamamak insanın tasarım gücünü arttırıyormuş demek :D)

istemci bir exe programı Server de de PHP uygulaması olursa thread işinden de sıyırılabilir diye düşünüyordum ama sabah ne yazıkki denemelerim başarıllı olmadı çünkü PHP nin socet fonksiyonlarının bir çoğu win sistemde çalışmıyordu Linuxda da denemeden önce bir bilenin fikrini almayı düşünyorum.

Bu denemenin ayrıntılarını kafamda biraz planlardım hatta istemci programı için lazım olacağından bir kaç HTTP komutunu denedim fena değil..

Neyse birilerinin fikrini alma işiyle ilgilenirim örneğin bu forumda bayağı aktif phpciler var gördüğüm kadarıyla.

ama şimdilik bir tarafta kalsın belki ilerde proggama webden ulaşmak için birşeyler eklenebilir.


sanırım biraz karışık oldu birdaha çay içerken msg yazmıyacağım :)
üstelik 8 saat bişeler anlattıktan sonra hiç yazmıyacağım :D

Fikirlerinizi Sabırsızlıkla bekliyorum :)
iyi çalışmalar...

Sahin
14/08/2002, 18:55
Ben takipteyim biliyorsunuz ;)

ee++
14/08/2002, 20:19
Selam,

CrazyCat, Web tabanli istemciyi yazdın da sunucu ne idi ya? daha once bize verdigin mi? İşlerin web tabanli olması konusunda fazla bir fikrim yok şu anda, avantajlarını bilemiyorum.

Ben şahsen böyle bir uygulama yazdığım zaten bir döngü içinde yaratabildiğim kadar istemci yaratir ve bunlarin da her birisinin döngüler içinde durmadan gönderebildikleri kadar mesaj göndermelerini sağlardım, maksat sunucuyu kasmak! :) Yani kullanicilar bizler değil de durmadan sunucuya bağlanan ve durmadan yazışan bilgisayarlar olacak. Böylece ne kadar çok istemci+mesaj yoğunluğuna dayanabildigine göre sunucuyu değerlendirme şansımız olur. "Kullanıcılar 10 saniyede bir mesaj yazar", "en fazla 100 kullanıcı olur" gibi varsayımlar çok da geçerli değil.

Sahin, başın dönedimi senin daha? :)

Sahin
14/08/2002, 20:26
Hayır zevkle takip deiyorum :D

Biliyorum ki sonunda burada ilk türk messengerini yapacağız ve bütün üyler onunla chat yapmanın zevkini tadacağız. :super:

Bir an önce start alacağımız zamanı bekliyorum. Herkes elindeki tuzu katsın çorbaya...

CrazyCat
14/08/2002, 21:00
selamlar.

@ee++ web tabanlı danediğim istemci yine daha önce yazdığım örnek sunucuya bağlanıp msg gönderiyor. Serverde bullunan bir php programı ile bütün istemcilere ayr ayrı msg göndermek mümkün oluyor. Buna sadece ekelenebilecek bir güzellik (özellik) gözüyle bakıyorum tabi beni düşündüren bir çok nokta da var benim gibi geceleri uyuyamayan birisi basit bir script yazarak bütün kullanıcılara kaynağı takip edilmesi zor olan spamlar yazabilir. tabi bu fikirle yola çıkarak icq için yaptığım denemelerde çuvallamamama şaşmadım çünkü anlamakta zorlandığım bir yığın önlem almışlar:)

bu işin önemsiz kısmı.

web tabanlı bir sunucu yapısının avantajlarını bende bilmiyorum ama şu anda icq u yakın takibe aldım (hiç istemiyor olamma rağmen 2-3 yıl sonra tekrar kurdum :) )

belki amerikayı yeniden keşfetmiş gibi olacağım ama ilginç izlenimlerim oldu.

denidiğim birkaç makinede birbirinden farklı olarak birkaç yerel porttan mirablis e ait serverlera www portundan bağlı kalarak çalışıyorlar denemek için aynı adreslerden http isteminde bulundum başka bir sub domaine yönlendirmekle beraber http istemlerine yanıt veriyorlar. aklıma şu sorular takıldı:

acaba bu serverlerın arkasında web tabanlı bir uygulama mı yatıyor?
eğer öyle değilse neden 80 nolu porttan bağlanıyor ve neden http istemlerini başka bi yere yönlendiriyor.
www portu nun çoklu bağlantı özelliği için mi bunu tercih temişler yada ordada özel bir server programı çalışıp standart istemcilerin dışında gelen istemleri ayıklayıp bir wep servere mı yönlendiriyorlar.

anlamak için aklıma şöyle bir çözüm geldi. yüklediğim icq online iken bağlı oldukları portları dinleyen bir program ile araya girip mesaj trafiğinin içeriğini öğrenmek.

böylece hangi porttan neden bağlı msg giderken ve gelirken nasıl bir veri paketi ulaşıyor. dahası aynı portlara aynı şekilde bağlanarak rastgele giden paketlere nasıl cevaplar geldiğini öğrenmeye çalışmak gibi bir dizi işlemleri gerçekleştirebilirsem belki yeni fikirler edinebilirim.

yada gidip şirketi basmak gerekiyor :)

tabi bu arada sayamıyacağım kadar çok serverleri olduğunu farkettim buda o kadar istemciye nasıl cevap verebildiğini açıklıyor. tahminimce üye bölgelerine veya numaralarına göre guruplara ayırarak serverlara yönlendiriyo..

Web taanlı bir server uygulamasının olabilirliği için deneyemediğim bir çok fonksiyon var onlar için php bölümünde bir konu açtım eminim ilgili arakadaşlar bişeyler söylerler..

onun dışında istemci sayısının fazlalığını örnek olarak vermiştim sadece 100 yada 1000 gibi bir sınırlama düşünmek yanlış programcılık örneği olur. bahsettiğim gibi bir çözüm bulunabilir. yada yoğunluğa göre iş iş paylaşımı gerektiren bir yapı kullanılabilir.

tabi birde profesyonel cözüm olarak grid processing düşünülebilir ama henüz thread ile bile baş edememişken böyle maceraya girmek istemem :)

@Sahin takipte olman beni mutlu ediyor bazen yanlızken bişeler yazmak çok zor oluyor :)

Sahin
15/08/2002, 18:02
her zaman takipteyim, programlamadan anlasam çoktan dalmıştım konuya :p Bir ara delphi kurdum merhaba dünya falan yazdım bir iki ufak tefek şeyde yaptım ama web programlama daha ağır bastı :)

ama şu işi bir koordine edelim süper olacak göreceksiniz. kendi messengerimizle chatleşmek, başkalarının kullandığını bilmek,... düşünün ;)

CrazyCat
16/08/2002, 22:19
nedense bu mesajım yarım gitti silmek zorunda kaldım :(
dikkate almayın (sanırım silemedim de :( )

CrazyCat
16/08/2002, 22:21
Selamlar 1-2 gündür biraz sessiziz :)

Bugün biraz vakit ayırıp programda kullanılabilir amacıyla soket ve thread işlevleri için kod düzenledim.

kodların içeriği şöyle:

1. Öncelikle socket bağlantısı işlemlerini kolaylaştırmak amacıyla daha önce yazmış olduğum stream socket uygulamasında kullanılan işlevleri düzenledim.

- bir socket sınıfı oluşturdum ( CSocket adında :) ) temel soket işlemlerini üye fonksiyonlar haline getirdim. artık basitte olsa bir soket sınıfımız var :)

-Bana göre nesnel bir yapıya sokmak kod yazımı açısından olaylık getirecekti. Daha önceki örneğe göre çok daha basit yapıda ve nesneye yönelik oldu.

Tabi optimize edilmesi şart.
Csocket sınıfının yöntemleri özetle şunlar.

CSocket::Create();
CSocket::Bind();
CSocket:Listen();
CSocket::Accept();
CSocket::Recive();
CSocket::KurugaAt(string , char[]); //bundan vazgeçemedim :)

Tabi hepsi standart BSD fonksiyonları.. :)

Şuan deniyorum umut verici :) daha sonra yazılacak programları oldukça kolaylaştırabilir.

Csocket::Accept() işlevini döngüye sokarken ufak bir sorun çıktı şu an onunla ilgileniyorum. Halledersem mesaj alma ve gönderme/kaydetme işlevi için Thread kullanılabilecek.


2. Yine Basit bir Thread sınıfı için kod yazdım. biraz uğraştırdı ama elimdeki örnekler karışık olduğundan bir iki başarısız sortiden sonra en basit yapıyı elde ettim.
Denemeler yine oldukça umut verici :)
Thread için bir thread başlığı bir üye fonksiyonlar gerçekleştiren arabirim var yine bir basit bir ana program yazarak denedim oldukça hızlı çalışıyor. Ama bir çok denetim işini yapamadım.
Şu haliyle server programı için bazı denetimler gereksiz ama Thread yapısı daha da geliştirilirse iyi olacak.

elimdeki örneklerden en kolay çözülebilir olanı private constructor kullanıyordu bende ona dayalı bir tasarım hazırladım ama farklı nesneleri döndürürken başarılı olur mu bilmiyorum.

sanırım Thread sınıfı ile Socket sınıfını entegre etmek bayağı uğraştıracak hafta sonu bakmayı düşünüyorum.
Çalışır duruma getirince biryerlee koyacağım indirip incelemeye vakit ayırırsanız çok sevinirim:)

Thread yapısında bir Thread temel sınıf ve ondan türetilmiş ThBaglanti sınıfı var.

ThBaglanti sınıfı Private Constructor içeriyor
bir de private tanımlanmış code üye fonksiyonu var.
üst sınıfın run fonksiyonu thread oluşturarak code işlevini icra ediyor.

şu anda düşündüğüm code fonksiyonunda aktif CSocket sınıfından türetilmiş nesnenin Recive metodunu çalıştırmak sanırım bu şekilde multi thread bir yapı elde edebilirim..

denemek için code işlevinde sonsuz bir döngü açıp sayacı ekrana yazdıran bir kod yazdım.

ana programda ThBaglantı sınıfından 6 adet nesne oluşturdum
aynı zamanda da ana programda 50 ye kadar dönen bir döngü oluşturup ekrana çıktı vermesini sağladım. belli bir sayaçta da programı sonlandıracak kod yazdım.

sonuc olarak:
6 adet nesne de ayrı ayrı ekrana sürekli sayacları basarken ana programda döndüye soktuğum ekran çıktısı da araya girip sesini duyurabiliyordu :)

ana programdaki kod şu şekilde


ThBaglanti::create("Kullanici1");
ThBaglanti::create("Kullanici2");
ThBaglanti::create("Kullanici3");
ThBaglanti::create("Kullanici4");
ThBaglanti::create("Kullanici5");
cout<<"deneme \n";
cout<<"bi deneme daha \n";
ThBaglanti::create("Kullanici6");
int n=50;
while (n)
{
n--;
cout<<" ***************** buda benden****** \n";
if (n==2) return 0;



çıktısı şu şekilde oluyor:

deneme
bi deneme daha
** buda benden **
Kullanici1 thread 44 olustu
Kullanici1 Masaj No = 1
Kullanici2 thread 60 olustu
Kullanici3 thread 64 olustu
Kullanici4 thread 68 olustu
Kullanici5 thread 72 olustu
Kullanici6 thread 76 olustu
Kullanici2 Masaj No = 1
Kullanici3 Masaj No = 1
Kullanici4 Masaj No = 1
Kullanici5 Masaj No = 1
Kullanici6 Masaj No = 1
Kullanici1 Masaj No = 2
Kullanici2 Masaj No = 2
.....
Kullanici6 Masaj No = 3
Kullanici1 Masaj No = 4
Kullanici2 Masaj No = 5
Kullanici3 Masaj No = 5
Kullanici4 Masaj No = 5
Kullanici6 Masaj No = 4
Kullanici1 Masaj No = 5
Kullanici2 Masaj No = 6
Kullanici3 Masaj No = 6
.....
Kullanici4 Masaj No = 7
Kullanici6 Masaj No = 6
Kullanici2 Masaj No = 8
Kullanici3 Masaj No = 8
Kullanici1 Masaj No = 7
Kullanici4 Masaj No = 8
Kullanici5 Masaj No = 7
Kullanici2 Masaj No = 9
Kullanici3 Masaj No = 9
Kullanici1 Masaj No = 8
Kullanici4 Masaj No = 9
Kullanici5 Masaj No = 8
Kullanici6 Masaj No = 7
Kullanici2 Masaj No = 10
Kullanici1 Masaj No = 9
Kullanici3 Masaj No = 10
Kullanici5 Masaj No = 9
Kullanici6 Masaj No = 8
Kullanici2 Masaj No = 11
Kullanici4 Masaj No = 10
Kullanici3 Masaj No = 11
Kullanici1 Masaj No = 10
Kullanici6 Masaj No = 9
Kullanici5 Masaj No = 10
Kullanici4 Masaj No = 11
....
Kullanici2 Masaj No = 12
Kullanici6 Masaj No = 12
Kullanici4 Masaj No = 14
Kullanici2 Masaj No = 15
Kullanici3 Masaj No = 15
Kullanici5 Masaj No = 13
Kullanici6 Masaj No = 13
Kullanici1 Masaj No = 14
Kullanici2 Masaj No = 16
Kullanici3 Masaj No = 16
Kullanici5 Masaj No = 14
Kullanici6 Masaj No = 14
Kullanici1 Masaj No = 15
Kullanici4 Masaj No = 15
Kullanici2 Masaj No = 17
........
Kullanici6 Masaj No = 16
Kullanici1 Masaj No = 16
Kullanici4 Masaj No = 17
** buda benden **
Kullanici2 Masaj No = 19
Kullanici3 Masaj No = 19
Kullanici5 Masaj No = 17
Kullanici1 Masaj No = 17
Kullanici4 Masaj No = 18
....
Kullanici5 Masaj No = 1494
Kullanici3 Masaj No = 1487
Kullanici1 Masaj No = 1501
Kullanici4 Masaj No = 1493
Kullanici5 Masaj No = 1495
** buda benden **
Kullanici3 Masaj No = 1488
Kullanici2 Masaj No = 1493
Kullanici4 Masaj No = 1494
Kullanici5 Masaj No = 1496
Kullanici1 Masaj No = 1502
Kullanici2 Masaj No = 1494
Kullanici3 Masaj No = 1489
Kullanici4 Masaj No = 1495
Kullanici1 Masaj No = 1503
Kullanici5 Masaj No = 1497
bi deneme daha
** buda benden **
** buda benden **
** buda benden **
** buda benden **
** buda benden **



Neyse biraz uzattım galiba. kusura bakmayın :(
Bazı ufak tefek ayıklamaları yaptıktan sonra işlevleri birleştirip kodların adresini burdan vereceğim:)

iyi çalışmalar :)

ee++
16/08/2002, 23:37
Ya, CrazyCat çok dağıtmışsın takip edemedim. Belki ben yorgunum.

Ammaa.., O şekilde Socket islevlerini sınıfa toplaman pek bi işe yaramamış çünkü soyutlama yok orada. Kurucu işlev port ve listen değerlerini filan alacak mesela ve create ve listen ı beraber yapacak. Sonra, send ve recv yerine, sendmessage, recvmessage gibi daha üst düzey islevler tanımlanmalı ve bunlar mesahj nesneleri göndermeli. Serialization filan düşünülebilir. Bilmiyorum şu an, yorgunum.

Kolay gelsin.

CrazyCat
17/08/2002, 15:36
@ee++: Haklısın biraz karışık olduğunun farkındayım dün iki işlev (socket ve thread) için sınıf oluşturmam bir hataydı ama zamanı daha etkin değerlendirmek isterken bazen planlamada verimlilik ön plana çıkamıyor.

tabiki ilk tasarımdan etkinlik beklenmesini ummuyorum. amacım üzerinde tartışılabilir bir çalışma olması sizlerin de yardımıyla daha kararlı bir socket sınıfı oluşturabileceğimize inanıyorum.

kendimce tasarımda ilk hedefin "basitlik" olduğunu düşünüyorum. grup çalışmalarında ve "tekrar kullanımda" oldukça faydalı bir zemin oluştur.

şimdi yapıyı bir daha incelediğimde daha güvenilir bir sınıf hiyerarşisi oluşturmak için temel bileşenleri bir ana sınıfta toplayarak belirgin kullanımlara daha uygun türetilmiş sınıflar tasarlayabileceğimizi düşündüm.

belkide ana sınıf "soyutlanmış sınıf" olmalı böylece alt sınıflarda üzt düzey işlevleri daha güvenilir oluşturabiiriz.

şu andaki tasarımda tek bir sınıf var ve yapıcı işlev port değerini nesne yaratılırken alıyor.

temel sınıfın yapısı şöyle:




class CSocket {

public:

CSocket (short nPort)
:
Cport(nPort)
{}
~CSocket();

int Create();
int Bind();
int Listen();
int Accept();
int Recive();
int KurugaAt(string kuyruk, char kayit[255]);

private:

short Cport;
int nRet;
SOCKET listenSocket;
SOCKET remoteSocket;
SOCKADDR_IN saServer;


};



şu an için bu sınıfta KuyrugaAt() işlevini private olmasının gerektiğini düşünüyorum. O işleve Recive() methodu ulaşıyor sadece. Ama sınıf hiyerarşisi oluşturulacaksa üst düzey işlevlerin bulunduğu alt sınıflarda tanımlanması gereken bir kaç ek işlevle birlikte gerçekleştirilebilir.

sınıf gerçekleştirimini burda gösteremiyeceğim biraz uzunca daha kararlı bir yapıya sahip olunca nete yüklerim.

eğer benzer işlevlere sahip daha kalabalık bir sınıf hiyerarşisi oluşturulacaksa gerçekleştirimlerin bir kitaplıkta toplanmasının yararlı olacağını düşünüyorum. Tabi sıfır hatalı ve kararlı bir yapıya sahip olduktan sonra.

ozaman thread sınıfı işlevleri ile nasıl bir senkronizasyonu olması gerektiğini tartışabiliriz.


tabi daha az yorgun olduğun bir zaman yardımcı olabilirsen sevinirim..

iyi çalışmalar :)

ee++
17/08/2002, 15:48
Niye Recive var da Send yok? (Bu arada Receive olacak o..)

Daha once de dedigim gibi bu yapi bir soyutlama saglamiyor ya da eklenmesi gereken seyler var. Eger ornek olsun diye incelemek isterseniz TCPServer gibi siniflari bi inceleyin, MFC'de ya da Borland'de var.

Kolay gelsin.

RaiST
17/08/2002, 16:00
Orjinal mesajı gönderen ee++
Niye Recive var da Send yok? (Bu arada Receive olacak o..)

Daha once de dedigim gibi bu yapi bir soyutlama saglamiyor ya da eklenmesi gereken seyler var. Eger ornek olsun diye incelemek isterseniz TCPServer gibi siniflari bi inceleyin, MFC'de ya da Borland'de var.

Kolay gelsin.


ewt ee++ın dedigi gibi iyi bir soyutlama lazım mesela;
tcpserver socketi yaratmalı , bindlamalı listen etmeye baslamalı vs...

CrazyCat
17/08/2002, 18:59
merhabalar

şu an benzer işlevleri olan sınıfları inceliyorum. ilk gördüğüm olumsuzluk MFC de Csocket diye bir sınıf varmış :mad: (mfc den pek hoşlanmadığım için bakmamıştım ama hata yapmışım)

daha öncek mesajda söylediim gibi sanırım en doğrusu temel işlevleri bir temel sınıfta toplayıp sınıfı "soyutlanmış sınıf" olarak yaratmak.

soket nesnesini yaratacağımız sınıfda ise daha üzt düzey işlevler tanımlayıp soyutlama sağlayabiliriz. (nesne yaratıldıktan sonra oluşturma , bağlama ve dinleme tek işlev haline getirilebilir)

tabi işe yaraması muhtemel diyer işlevleri de tanımlamak lazım. MFC nin Csocket sınıfında Yapıcı işlev değer almıyor oluşturmak için yaratılan işlev ise Csocket::Create() ise soket portu,soket tipi ve karşı adresi alıyor. (bu kısım bağlanmak için sanırım)
Accept metodu kullanılacaksa nesnenin create işlevi çalıştırılmıyor.
Accept, listen, send ve receive işlemleri temel sınıfta (CAsyncSocket ) mevcut bu şekilde soyutlama sağlanmış oluyor.
(benim demin söylediğim yapıya benzedi sanırım :) )

Ayrıca Csocket nesnesinde oldukça kullnaışlı bir iki işlev var mesala: CSocket::OnMessagePending (olay sürüşlü bir mantık için tasarlanmış olmalı)

şimdi bzim merhum CSocket sınıfında sadece port yapıcı fonk. tarafından kabul ediliyordu. soket tipini sabit tanımlamıştım (stream) farklı kullanımlar için sınıfın önünü tıkayabilir. eğer bir send metodu yazacak olsaydım muhtemelen bağlanan istemciye yönelikti. mfc nin sınıf hiyerarşisinde CSocket istemci ve sunucu için farklı yöntemlerle yaratılıyor.

tabi tüm bunlar yeni fikirler edinmeme ve düşüncelerinizden edindiğim eski tesbitlerimi perçinlemeye faydalı oldu.

sonuç olarak tekrartasarlanmalı ve eğer mümkün olursa ivedilikle yapacağım.

fakat bazı şeyleri göz ardı etmemek lazım. Örneğin MFC her nekadar tasarım açısından bir çok uzman tarafından hatalı, yetersiz veya karışık kabul edilsede birçok profesyonel tarafından bir ekip çalışması ile elde edilmiş. Bize iyi bir örnek olabilir ama ilk etapta daha iyisini yapmayı hedeflersek biraz dolmuş edebiyatı yapmış oluruz (tek rakibimiz hava yolları :) )

bence şunlar ivedilikle gözden geçirilmeli.

1. socet sınıfı için kapsam ve amaç ne olacak. bize lazım olan temel işlevlerin ötesinde genel kullanıma yönelik tasarım yapılacaksa iyice analiz edlimeden olmaz.

2. programı bir bütün olarak düşünüp sınıf tasarımlarının ona göre yapılması temel ihtiyaçları ön plana çıkarır. tekrar kullanım ve sınıf kütüphaneleri oluşturmak yaygınlaşma açısından iyidir (hatta bir çok yerli programcının duasını bile alabiliriz :) ) ama öncelikle temel işlevler oluşturulmalı kanısındayım.

3. Şu an için bile bir bütününün analizi sağlıklı yapılmadığı için hislerim bana socket-tread senkronizasyonunda tasarımı tekrar değiştirmek gerektirecek sorunlar yaşayabileceğimiz söylüyor.

4. Csoket için MFC ye halen kırgınım :)

Bu arada:

@ee++ recive ye aldırma bazen mail yazarken bile daha fazla düşünüp imla için türkçe sözlüğe bakıyorum :) sanırm program yazarken daha dikkatli olmak gerekiyor..

ayrıca send'i atlamamın sebebi elimde kurulu olan düzenekte server sadece gelen msg yi saklıyor istemciye birşey göndermiyor o nedenle gözümden kaçmış.

@Raist sanırım tatilin bitti seni dah sık online görüyorum :)

bir son nokta fikirleriniz için teşekkürler. tahminimce iki arada bir derede yazıyorsunuz eğer fırsatınız olduğunda haber verebilirseniz programları göndereyim inceleyip kodlar üerinde fikir imlerinizi koyun makbule geçer.

iyi çalışmalar..

Sahin
18/08/2002, 02:10
Hızlanalım arkadaşlar biraz tempo tempo :=) Sanki dans ediyoz diyecek biri :p

xseroot
19/08/2002, 04:24
arkadaslar forumdaki konuyu gördükten sonra bir göz atayım dedim , forumdaki 4 sayfanın 4 ünüde okudum ve gerçekten programlamaya yeni baslayan biri olarak konuya fransız kaldım ama böyle bir projenin inetrnet üzerinden gerçekleşebilecek olması çok hos ,projeye katkısı olacak olan herkesi şimdiden kutluyorum .Programın yapısı hakkında su anda size bir fikir veremiyeceğim ama bu projeyle ilgili her türlü dökümanın ve çalışamanın web üzerinde olması sanırım iyi bir fikir olabilir , ceviz.net webmaster ları bu konuda yardımcı olurlarsa (yeni bir bölüm mesala projelerimiz vb.)
Programlamaya yeni adım atan (ben gibi..) insanlar için çok faydalı bir kaynak olabilir , aslında socket programlama ilgim sadece iki arkadaş arasında chat yapabilmek için yazdığımız basit bir serversocket , clientsocket (delphi ve c++ builder da)programından öte değil onuda bir süre sonra kullanmamaya basladık; zaten kodlarıda çöken makinamın içinde kaldı. Ceviz.net altında bu proje için yeni bir bölüm açılabilirse çok iyi olur , hatta bir maillist bile oluşturulabilir. Eğer katkım olabilecekse elimden gelen herşeyi yaparım (tabii orta derece C, orta derece php bilgisi ve aşırı linux ilgisi ne kadar yetecek olursa ).Böyle projelerin dökümantasyonunun ve kodlarının bu işe yeni başlayanlar için ne kadar yol gösterici ve öğretici olduğunu sanırım sizde biliyorsunuzdur . hepinize iyi çalışmalar , bu proje çok şeyler öğretecek gibi takipçiniz olmaya devam edeceğim...:):)

ee++
19/08/2002, 14:01
@Sahin, asiri hiz olum getirir :)
@xseroot, o kadar heyecan yaparsak gume gider, mail list filan projelerin sonunu getirir, tecrubeleri olanlar bilir, sakin sakin :)

Sahin
19/08/2002, 21:17
Sakin sakin ama projede güzel proje ama. İlk Türk messengeri projesi var ortada heyecanlanmamak mümkün mü? Hele bu bitsin daha neler yapacaz ama bir başlasaydık :p

CrazyCat
22/08/2002, 03:12
Merhabalar.
Asiri hız da en az otobanda durmak kadar tehlikelidir :D

Birkaç gündür yeni soket sınıfı tasarlamak için elime kağıt -kalemi aldığımda ya işim çıkıyor yada kafamı toparlıyamıyorum :( Yarın (sanırım artık bugün oldu:) ) izine ayrılacak olmam dolayısıyla işlerim çok yoğundu. Araya daha önce yazdığım iki programı değiştirme işi girdi ikiside farklı dillerde olduğu için kafam iyice dağıldı. Ama tatildeyken sakin kafayla tüm tasarımı gözden geçirip planlamasını yapmayı düşünüyorum :) Tabi önce dinlenme ve eğlenme olacak :)

bu gün makinenin başında bişeler karaladım. Tabi bir tasarımcının yapması en sakıncalı olan şey bilgisayar başında tasarım yapmak olduğunu herkese söylediğimi unutarak.

Çok güvenilir olmamakla beraber beni de şaşırtarak yazdığım kodlar çalıştı :D

Şimdi yapmak istediğim şu:

- bir temel sınıf oluşturarak winsockun temel işlevlerini o sınıfta toplamak.
- ondan türetilmiş sınıflarda ise işlemleri üst düzeyde yaparak kodlamayı daha basit hale getirmek.
- serverde kullanılan yöntemlerle terminalde kullanılan yöntemleri bir sınıfta toplamak. Ama nesne oluştrumu esnasında farklı yapıcılar kullanmak. Yada MFC nin Csocket sınıfı tasarımında kullandığına benzer bir tasarım uygulamak (sevmesem de hoşuma gitti yöntemleri )
- Daha sonra bu uygulamada kullanacağımız özel işlevleri eklemek.

- daha önce yazdığım mesaj göndermek amacıyla tasarlanmış mesaj sınıfını ve thread işlevi için tasarlanmış sınıfı bir araya getirerek komple bir uygulama halinde denemek..

Tabi bunlar istediklerim. :)

şimdi elimde olanlar:

bilgisayar başında yazılmış bir socket sınıf tasarımı. en iyimser yanı çalışıyor olması birde Yeni ismi CNTCPSocket :D eminim MS in bu isimde bir sınıf tasarımı yoktur :) (CN Biyerden tanıdık gelio :))

sınıf hiyerarşisi şöyle :




class CSocket {

public:


int Receive();
int Send(string msg);
int Close ();

protected:

int Create(int nPort);
int Bind();
int Listen();
int Accept();
int KurugaAt(string kuyruk, char kayit[255]);


short Cport;
int nRet;
SOCKET listenSocket;
SOCKET remoteSocket;
SOCKADDR_IN saServer;


};


class CNTCPSocket : public CSocket {

public:
CNTCPSocket (short nPort)
:
Cport(nPort)
{}
~CNTCPSocket ();
int CNListen ();
int CNAccept ();
private:
short Cport;

};


CSocket temel sınıfının gerçekleştirimi biraz uzun
CNTCPSocket sınıfının kisi ise şöyle :



///////// CNTCPSocket sınıfı gerçekleştirimi ////////

int CNTCPSocket::CNListen ()
{

CSocket::Create(Cport);
CSocket::Bind();
CSocket::Listen();
return 0;
}

int CNTCPSocket::CNAccept ()
{
CSocket::Accept();
CSocket::Receive();
return 0;
}




Ana program ise şu şekilde..




#include "CNSocket.hpp"


////////////////////////////////////////////////////////////

int main()
{
short nPort;
int nRet;
nPort =2001;

CNTCPSocket MySocket(2001);
nRet=MySocket.CNListen();

while (1)
{
nRet=MySocket.CNAccept ();
cout<<"CNAccept donen ="<<nRet<<endl;
nRet=MySocket.Send("alindi");
cout<<"send donen ="<<nRet<<endl;
nRet=MySocket.Close();
cout<<"close donen ="<<nRet<<endl;

}

return 0;

}



* dönen değerler hata ayıklamak içindi

Şimdilik sadece çalışır bir örnek tasarımdan ibaret. en azından üzerinde iyileştirme yapılabilir. daha sonra yeni tutarlı bir tasarım ortaya çıkar.

bana göre öncelikle yapılması gerekenler şunlar:

- temel sınıfta en az birtane asıl sanal fonksiyon tanımlayarak temel sınıfı soyutlanmış sınıf haline getirmek. gerçekleştirme tam olmayacağı için temel sınıftan kullanıcının nesne yaratmasını engellemiş oluruz. Şu an için kestiremedim hangi fonksiyonlar olacağını

- terminal için connect işlevi de temel sınıfta tanımlanmalı böylece istenildiğinde aynı sınıftan hem sunucu hemde terminal için nesne yaratılabilir. iki ayrı sınıf kullanılmasına gerek kalmaz. zaten diğer yöntemler ortak. yanlız adres tanımlamaları biraz farklı o yüzden temel sınıfa bir yapıcı fonksiyon tanımlanır soket orda oluşturulur. adres tanımlama işlevi türetilmiş sınıfın Create fonksiyonunda tanımlanır. terminal için create kullanılmaz adres tanımlaması connect yönteminde tamamlanır. yada fonksiyon ekkulanımı düşünülebilinir.

Neyse.. Sanırım tatilde uğraşmak için bu karı yeterli :) Çok amaçlı kararlı ve kullanışlı bir soket sınıfı tasarımı bile tek başına bir çok programcının işini görecektir. Programın bir çok yerinde kullanılacağı için önce bunun tamamlanması ii olur. Hatta başarılı olursa küçük bir kitaplık olabilir.

ewt. yine biraz uzun oldu sanırım. :D tasarım konusunda fikir verirseniz sevinirim.

kolay gelsin :)


Not. Forum benim mesajlarımda hep hata veriyor. aynı imajı iki kere kullandınız diye bende smileyleri iptal etmek zorunda kalıyorum

Sahin
25/08/2002, 20:44
:super:

Şenol Akbulak
31/08/2002, 03:55
Merhaba projenizi okudum ve kabul ederseniz katılabilirm. Böyle bir etkinliğe ihtiyacım var.
İlk önce birkaç şey söyleyeyim.
Arkadaşımızın ilk önce projeye planlı programlı olarak başlaması güzel. Ama sonradan çorba haline getirmesi bir o kadar kötü.
Eğer bir proje ekibi kuruyorsanız ilk önce projeyi planlama gerekir. En azından sonradan yapılmış bir planlama, önceki yapılanlarıda kapsayacak bir şey. Bunuda en iyi projeyi başlatan arkadaşımız yapabilir.
Bilmem bana katılıyormusunuz.
Bu gibi bir proje bittiği zaman bir sorun çıkarsa içinden çıkılamaz.

Sahin
31/08/2002, 13:49
Sana katılıyorum Şenol, seninde ekibe katılmana sevindim dediğimiz gibi herkese kapımız açık. Crazy şu anda tatilde ama döner dönmez bu işi bir yola koyacaz inşallah.

LEthaL
31/08/2003, 00:42
Ben de takibe başladım. Haberiniz olsun. Ortaya çıkacak olan mesajlaşma programını test etmekten mutluluk duyacağım.
Kodları incelerken de bir çok şey öğreneceğime eminim.
İyi çalışmalar.

EAN
31/08/2003, 01:25
Ben de takipteyim.

Temel yapı oluştuktan sonra ek özellikler için güzel fikirler bulabileceğimi sanıyorum.

p4r4h4t
31/08/2003, 16:05
.NET + C# ile yazilirsa server tarafinin cok rahat gelistirilecegini dushunuyorum ama siz ishi C++ ile yoluna koymushsunuz sanirim

p4r4h4t
31/08/2003, 16:06
gelistirilen programin source koduna nasil bakabiliriz?

Volkan Uzun
01/09/2003, 00:21
bende takipteyim,
katılımım ancak visual c ile yazilirsa olabilir.
umarım bişilr ortaya çıkartırsın crazycat

redial
02/09/2003, 09:02
bende buradayim, c# ve visual basic kullanmadiginiz surece elimden geleni yapmaya hazirim...
Hani mesela birileri php demisti, web arayuu demisti...
:super:

HunTER
02/09/2003, 12:20
Katılıyorum, ısın PHP ye dusen kısmında elımden gelenı yapabılırım.. Hem elımde CN_Bot gıbı hazır bı nesnede var :) Dıger taraftan bu proje ılk yasını dolduralı sanırım bır ay olmus.. Umarım yıne butur bı bekleme donemıne gırılmez..

Not: Tabı once TextDB'yı bıtırmelıyım :)

Sahin
25/09/2003, 02:17
Hey gidi günler heyyy :)

Volkan Uzun
25/09/2003, 03:46
yinede hey hey

p4r4h4t
06/11/2003, 18:47
http://iserverd.khstu.ru/

dreammaker
16/11/2003, 00:23
5 Sayfayı da büyük bir merakla okudum...
08-22-2002 03:12 'de son mesaja kadar da sürükleyici bir roman gibi...
Ne kadar acı ki romanın sonu gelmemiş...
Umarım birileri çıkarda bu romanın devamını getirir...

Not: Matrix'in bile devamı çekilmişken projeye ayıp olmuş.

Haymac
10/07/2004, 11:13
Projeneye neler oldu acaba :??

PhpX
16/10/2005, 16:03
Projeneye neler oldu acaba :??

Burda Yazan Arkadaşlar NErdeler Proje Gene Bitmemiş :) Birkaç Sorum Olacaktı Bu Konu Sanırım 2003 De Açılmış o Zaman Ki İle Şimdiki Bilgileriniz KArşılaştırılamaz.Bunu Göz Önüne Alarak Şunu Soracağım.Php Kodu Oluşturmuşsunuz Ama Server Sürekli Olarak Açık Kalmak Zorunda Bunu Nasıl Yapmayı Düşündünüz Yada Yaptınız Mı ?

Revne
24/01/2006, 20:22
Sanirim projenin omru 5 sayfalikmis..
Bu proje, bitmeyen projelerin sayisini %0.0000000189 oraninda arttirdi :).

acehreli
24/01/2006, 20:28
Olmeyen konulari da unutmamak gerek. Uc bucuk yil olmus hAlA devam... :)

Ali

Revne
25/01/2006, 01:24
Sanirim Msn messenger fikrini ilk bizimkiler buldu.. :).
Eger proje sonuclanmis olsaydi. Belki de turkiyede cogu insan Ceviz Messenger kullaniyor olacakti.

Yeni projeler gelistirelim. Ne dersiniz??