Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

winsockla server yazarken


Öne çıkan mesajlar

Mesaj tarihi:
c'de server yazarken multithreaded mi yazılması daha avantajlıdır ? yani her client için bir thread, onun dışında main'de yürütülen işlemler (ne bileyim oyunsa karakterlerin konumlarının updateleri falan). bunun bana ne gibi bir zararı olur ? hayır diyorsanız diğer yöntemleri de avantajlarıyla söyler misiniz

bi de bişey daha sorayım hazır ilgili başlık açmışken. bir clienti disconnect ediyoruz diyelim, client için ayrı bir class var ve disconnect fonksiyonu da bu classın içinde. içinde closesocket bilmemne var :

void client::disconnect()
{
closesocket
shutdown

clients[id]=NULL; <- bu global bir değer, pointer dizisi
delete this; <- sorum burda işte. classın içinde classı sildirirsem eror meror alır mıyım ?
}
Mesaj tarihi:
ilk soruna hitaben, nasi bi yapcan?
basit bi odev flnsa hic kastirma thread, ama coklu kullanicilar baglancaksa lazim threading.

c++'ta yaziyorsun sanirim, disconnecti bi kere kullancagina gore icinde diger classi sildirmen sorun olmaz gibime geldi ama, kesin bilgim yok. en saglami sen bi dene error verirse dusunuruz :)
Mesaj tarihi:
senko'nun dediği gibi ödevse ve threading özellikle istenmiyorsa hiç uğraşma. Ha öğrenecem bilader diyorsan sana kalmış, ama biraz zamanını yer. Gerçi örnek verdiğin class'da çoklu kullanıcı için gibi duruyor, bilemedim.
Mesaj tarihi:
disconnecti yazmamın amacı doğal olarak işte soket eroru falan çıkarsa hem clienti disconnect edip hem de diğerlerinin bunu bilmesini sağlamak zaten. ha böyle bir şey olmuyorsa çok önemli değil, server classına disconnect yazarım içinde id parametresi gereken.

yok ben genel olarak sordum multithread mı yoksa async socket mi diye.

@dely evet şu an yaptığım multithreadli

accept kısmı şu şekilde :

sv->player[cur]=new Player(cur,cvt.ClientLogin.name);
sv->player[cur]->id=cur;
sv->player[cur]->sock=sv->connsock;
sv->client_thread[cur]=CreateThread(NULL,0,client_t,sv->player[cur],0,NULL);
sv->playercount++;

thread ise şu

DWORD WINAPI client_t(LPVOID arg)
{
bool respond=1;

while(sv->loop && respond)
{
if (!((Player*)arg)->RecvPack()) // gelenleri al
respond=0; // kes cezayı
}

((Player*)arg)->Disconnect();

ExitThread(0);

}
Mesaj tarihi:
buldum sanırım

http://www.geekinterview.com/question_details/16831

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15


kısacası yok ben vazgeçtim. disconnecti kullandıktan sonra başka yerde sildiririm memberı.

c++nın destructor olayı basit gibi görünüyor da çoğu kitapta falan açıklanmamış ayrıntıları var. şu site acayip iyi anlatıyor
http://www.parashift.com/c++-faq-lite/dtors.html

bana kalsa, destructorda pointer memberları kendim tekrar sildirecem, eror alacam.

edit : site cidden güzelmiş ya kafamda soru kalmadı bellek yönetimiyle ilgili
Mesaj tarihi:
delete this çok sakat. Bi obje bellekten silinecekse bunu o objenin sahibi yapmalı, kendisi değil.

Clientları da array içinde değil de, array'i wrap eden ClientList şeklinde kendi yazdığın bi sınıf içinde saklamak daha sağlıklı. Hatta çok elzem değilse pointer değil referans şeklinde tut.
Hatta ve hatta ben olsam disconnect metodunu DisconnectClient(client& cl) şeklindeki bi fonksiyonla ClientList sınıfına yaptırırdım, client objeleri destruct edilirken kendi soket bağlantılarını kapatırdı.
×
×
  • Yeni Oluştur...