Gönderen Konu: Winsock yardım  (Okunma sayısı 15533 defa)

Winsock yardım

« Yanıtla #15 : 22.01.2010 19:39:58 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
skate kaynaklar için teşekkür ederim..Anlattığın şekilde bi deniyeceğim..Birakaç bişey daha deniyeceğim ayrıca Birazda araştırma yapmam lazım..

deniz Yardımın için teşekkür ederim..O kütüphaneleri biliyorum.Onlarıda inceliyorum tabiki..Biraz araştırmam var ama Burda değişik fikirlerele kendim birşeyler karalarsam daha güzel olur..

Bizde şubat taliline giricez..Zamanım olucak uğraşmaya.Test etmek için buraya uygulamada koyucam.
« Son Düzenleme: 22.01.2010 19:46:22 Gönderen: paradox »

Winsock yardım

« Yanıtla #16 : 28.01.2010 01:24:32 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Arkadaşlar raknet'te yaptığım program kendimde deniyorum çalışıyor fakat online denediğimde bağlanmıyor..Bir sürüde komutu var çıkamadım işin içinden..
Port'umda açık zaten kendi kütüphanemde online bağlanıyordu.
raknet'de client portuda kullanılıyor ne ayaksa anlamadım zaten..
Paket gönderme olayı güzel ve hızlı ama online neden olmadı anlamadım..
ıngilizcem pek iyi değil ..şimdi foruma sorucam ama iş uzuycak anlaşamıcaz falan..
Bilgisi olan varsa bu konuda yardım bekliyorum
« Son Düzenleme: 28.01.2010 01:30:03 Gönderen: paradox »

Winsock yardım

« Yanıtla #17 : 28.01.2010 01:49:44 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
1) Server olarak kullandığın makinenin firewall'unda UDP portunun açık olduğundan emin ol. Yanlışlıkla TCP açmış olabilirsin diye belirttim.
2) ADSL arkasındaysan modem ayarlarından kendi iç IP'ne yönlendirme yapman lazım (NAT ayarı). Daha sonra dışardan bağlanacak olan kişi senin whatismyip.com'dan görebileceğin dış IP'ne bağlanmalı.
 
Bunları zaten biliyor/yapmış olabilirsin. Ben elimdeki az veriyle ihtimalleri saydım sadece.

Winsock yardım

« Yanıtla #18 : 28.01.2010 16:11:45 »
Hızlı düğmeleri aç

deniz

İleti: 22

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://www.cizbakalim.com
loopback üzerinden düzgün çalıştığına göre büyük ihtimal ile skate inde dikkat çektiği üzere bir şekilde adsl router a takılıyor paketlerin.

Raknet bağlantı yönetimi sunucu ve istemci için ortak olarak PeerInterface üzerinden yürütüyor. Biraz alışılmadık bir durum ama özellikle peer-to-peer uygulama yazıyorsan çok işlevsel bir hale geliyor (adı üstünde) . Fakat günümüzde genelde client-server işler yapıldığından bu nesne ilk bakışta biraz garip gözüküyor gerçekten. Client interface de port tanımlamak zorunda değilsin, bu tanımlamanın zorunluğu sadece server için geçerli.

Winsock yardım

« Yanıtla #19 : 29.01.2010 14:47:32 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
1) udp portu açık değilmiş..onu açınca düzeldi:rolleyes:
şimdi sorununum şu..servera 2 tane client bağlıyorum bunlar birbirine sayı değerleri gönderiyor.
Fakat 3. clienti sokduğumda bundan gelen değeri diğer client'ler alırken karışıyor..
Deniz sanırım raknet tecrüben var..kodu buraya atıyorum

unsigned char msgID = p->data[0];
if(msgID==ID_NEW_INCOMING_CONNECTION)
{connect++;}

Burda server  int tanımlı A yı alıyor clientlere gönderiyor.

RakNet::BitStream ss;
ss.Write(unsigned char(ID_WRITE));
ss.Write(A);
server->Send(&ss, HIGH_PRIORITY, RELIABLE_ORDERED, 0,p->systemAddress, true);

 
 RakNet::BitStream bs(p->data,p->length,false);
unsigned char packetID;    
    bs.Read(packetID);
  switch(packetID) {
        case ID_MYOBJECT_CREATED:
        bs.Read(A);
        server->DeallocatePacket(p);
    p = server->Receive();
break;
        default:
printf("%d\n",A);

benim istediğim diğer oyunculardan gelen verileri arıyıp array'da tutmak..Başka yoluda vardır tabi..Bu kütüphaneyi bilmediğimden bunu kurcaladım ilk.
« Son Düzenleme: 29.01.2010 14:50:13 Gönderen: paradox »

Winsock yardım

« Yanıtla #20 : 29.01.2010 15:04:12 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
senin kodların üzerinden yorum yapamayacağım ancak ben bu işi şöyle çözmüştüm.
 
Kod: [Seç]
void sendToAll(CHAR* data, DWORD length) {
    WSABUF buffer;
    buffer.buf = data;
    buffer.len = length;
    ClientConnection* cc = cc->first;
    while(cc != NULL) {
        try {
            WSASend(cc->getSocket(), &buffer, 1, NULL, 0, NULL, NULL);
        } catch(CHAR* error) {
            printf("Error occured: %s\n",error);
        }
        cc = cc->next;
    }
}
 
void sendToRest(ClientConnection* sender, CHAR* data, DWORD length) {
    WSABUF buffer;
    buffer.buf = data;
    buffer.len = length;
    ClientConnection* cc = cc->first;
    while(cc != NULL) {
        if(cc != sender) {
            try {
                WSASend(cc->getSocket(), &buffer, 1, NULL, 0, NULL, NULL);
            } catch(CHAR* error) {
                printf("Error occured: %s\n",error);
            }
        }
        cc = cc->next;
    }
}
 
void reply(ClientConnection* sender, CHAR* data, DWORD length) {
    WSABUF buffer;
    buffer.buf = data;
    buffer.len = length;
    try {
        WSASend(sender->getSocket(), &buffer, 1, NULL, 0, NULL, NULL);
    } catch(CHAR* error) {
        printf("Error occured: %s\n",error);
    }
}

sendToAll - sender bilgisine ihtiyaç duymuyor. Linked listte ne kadar client varsa hepsine gönderiyor aynı bilgiyi.
 
sendToRest - hemen hemen SendToAll ile aynı ancak fazladan sender parametresi alıyor. paketi gönderen her kimse o hariç tüm clientlara gönderiyor paketleri.
 
reply - bu ise sadece paketi gönderene yanıt olarak paket gönderiyor.
 
Benim başka bir case'e ihtiyacım olmamıştı. Yani gruplar halinde bir client grubuna paket göndermem gerektirecek bir durum olmamıştı. O tür ihtiyaçlar doğdukça bu fonksiyonların birkaç ilave parametre alan versiyonlarına da ihtiyaç olacaktır tabii ki.

Winsock yardım

« Yanıtla #21 : 29.01.2010 15:50:21 »
Hızlı düğmeleri aç

deniz

İleti: 22

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://www.cizbakalim.com
Ben genellikle bilmediğim bir kütüphane ile uğraşırken ilk olarak kütüphane ile gelen -varsa- örneklerden işime yarayabilecekler üzerinden gidiyorum. Yapacağım ufak tefek değişiklikler ile bu kod üzerinde birşeyleri bozana kadar denemelerimi yapıyorum, sistemi iyice anladığımı düşündüğüm noktada kendi kodumu öğrendiklerim doğrultusunda baştan temize çekip yazıyorum. Sana bu yöntemi kullanmanı tavsiye ederim; raknet dökümantasyonu harika değil, ama raknet ile beraber gelen örnek uygulamalar oldukça yeterli. Ayrıca internet te insanların hazırladığı pekçok giriş seviyesi döküman da var; şu aşağıdaki döküman ilk başladığımızda bizim bayağı işimize yaramıştı; izlemeni tavsiye ederim; Açıkçası buradaki problemini tam olarak anlayamadım, kusura bakma.

step1 deki irrlicht e özgü kısımları atlatırsan gerisi network kodu;
http://www.daveandrews.org/articles/irrlicht_raknet/step1.htm

Kolay gelsin, iyi çalışmalar;

ekleme;
Üstteki mesajında ingilizcenin yeterli olmadığından dem vurmuşsun; ukalalık olarak algılama fakat bence bu noktada kendin için yapacağın en iyi şey raknet felan bırakıp teknik belge okuyabilecek kadar ingilizce bilgini ilerletmen. "Salak mı ne bu herif" diyebilirsin, ama inan ki yabancı belgeleri anlayamıyor isen programlama ile uğraştığın her alanda bir şekilde biryerlerde çarçabuk takılıp kalmaya ve yılgınlıkla başladığın işi bırakmaya mecbur kalacaksın. Umarım yanlış anlaşılmam.
« Son Düzenleme: 29.01.2010 15:55:10 Gönderen: deniz »

Winsock yardım

« Yanıtla #22 : 29.01.2010 16:21:18 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
ıngilizce konusunda yeni bir tartışma topici açılabilir dilerseniz. Ben konuyu çok dağıtmadan sadece ıngilizce harici bilmediğim dillerden yayınlanmış (buna uzak doğu gibi harflerini bile okuyamadığım diller de dahil olmak üzere) dökümanlardan bile faydalanabildiğimi hatırlatmak isterim. Yani bu konuda çabuk teslim olmamak gerekiyor. Elbette ki ıngilizce bilmeyen kişi dökümanı zevkle overview'dan itibaren adım adım okuyup, dökümanı yazanın espiri anlayışına kadar zevkini çıkararak okumaktan mahrum kalıyor. Ancak bunun gibi bir örnekte dökümanda verilecek kod örnekleri bile genellikle konuyu anlamaya yetecektir.

Winsock yardım

« Yanıtla #23 : 29.01.2010 17:22:16 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Benim kodda bi hata yok..skate'in sendToRest olayı gibi server bir clientten alıp diğerine veri yoluuyor..Gönderdiğin link'de temel aynı ben bi fark göremedim..

(gönderdiğin örnek koddan aldım)

switch
(packetID) {
   case PACKET_ID_LINE:
        int x1, y1, x2, y2;
       
        dataStream.Read(x1);
        dataStream.Read(y1);
        dataStream.Read(x2);
        dataStream.Read(y2);
       
        SendLineToClients(server, p->playerId, x1, y1, x2, y2);
    break;
Burda Read(x1) i okuyup gönderme işlemini gönderen kullanıcı hariç diğerlerine gönderiyor..

 Benim takıldığım yer şu..4 veya 5 tane bağlantıdan bilgi geliyor servera ..bu bilgiler bi cliente gidiyor..
Clientin aldığı bilgilerin kimden geldiğini , kime işleneceğini nasıl anlarım..

server gönderdi
datastream.Write(x1)

client aldı
datastream.Read(x1)

Bu x1 in içinde diğer oyuncuların bilgileride var ..Bunları nasıl ayırd edicem..
mesela :

KendiPozisyonum(x1,y1);
gönder(x1,y1);

Oku(gelenx1,geleny1)
Oyuncu[1].poz(gelenx1,geleny1)
Oyuncu[2].poz(gelenx1,geleny1);
..
Oyuncu[n].poz(gelenx1,geleny1);

(dediğim zaman hata olur sanırım) bunun için nası bi yöntem var onu sordum..

Winsock yardım

« Yanıtla #24 : 29.01.2010 18:30:30 »
Hızlı düğmeleri aç

deniz

İleti: 22

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://www.cizbakalim.com
Bunu kendi oluşturduğun protokol içerisinde halletmen gerekir. Örneğin bir oyuncunun pozisyonunu güncellemen gerekiyor diyelim. Sunucu p1 oyuncusunun güncel pozisyon bilgisine sahip (p1x,p1y gibi olsun). Bu bilgiyi p1 hariç diğer tüm oyunculara göndereceğini varsayalım ( aslında p1 e de tekrar göndermek bir tercih olabilir ama konumuz ile bir alakası yok şimdi bunun). Veriyi gönderirken sadece p1x,p1y verisini değil, bu verinin kime ait olduğunu da pakete iliştirmen gerekir. Her oyuncuya bir numerik id verip (0,1,2 gibi ) bu sayıları oyuncuları ayırmak için kullanabilirsin.

Sunucu veri okurken kimden geldiğini biliyor, socket bağlantı noktaları farklı. Ama client tarafında tüm haberleşme sadece sunucu ile yapıldığı için protokol içerisinde bu ayrımı halletmek bir mecburiyet.

deniz.

Winsock yardım

« Yanıtla #25 : 29.01.2010 23:02:33 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
benim sistem şöyle işliyor. ilk bağlantıda client server'dan bir ID request ediyor. server bu ID'yi üretip client'a geri yolluyor. client kendi bilgilerini server'a yolluyor. server client'a diğer tüm playerların o an için mutlaka ihtiyaç duyulan bilgileri varsa onları gönderiyor (kısaca bilgilerin bir kısmı başlangıçta cacheleniyor).

Winsock yardım

« Yanıtla #26 : 31.01.2010 18:26:44 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Alıntı yapılan: skate;22436
benim sistem şöyle işliyor. ilk bağlantıda client server'dan bir ID request ediyor. server bu ID'yi üretip client'a geri yolluyor. client kendi bilgilerini server'a yolluyor. server client'a diğer tüm playerların o an için mutlaka ihtiyaç duyulan bilgileri varsa onları gönderiyor (kısaca bilgilerin bir kısmı başlangıçta cacheleniyor).

Bende onu yapmaya çalıştım aslında ama ID'yi nasıl üreticem ne şeklinde göndericem orda karıştırdım olayı..

Winsock yardım

« Yanıtla #27 : 31.01.2010 19:45:45 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
ID iki şekilde olabilir.
 
1) Autoincrement. Her yeni requestte bir artar gönderilen ID. Aradan bir client disconnect olsa bile onun ID'si başka bir client'a verilmez (daha doğrusu bununla uğraşılmaz).
2) Unique bir ID generate edilebilir. GUID benzeri birşey ancak o kadar uzun olmak zorunda değil. Örneğin Base64 encoding ile üretilmiş 8 haneli bir string ya da doğrudan 8 bytelık random bir ID iş görecektir. Bana kalırsa bir float genişliği bile (4 byte) bu iş için yeterli olacaktır.
 
1. yöntem çok daha mantıklı bence. Sonuçta 32 bit olarak düşünecek olursak 4 milyardan fazla client bağlanana kadar zaten server en az bir kez restart edilecektir öyle değil mi?

Winsock yardım

« Yanıtla #28 : 31.01.2010 23:26:38 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
player id'leri bir database'den de okunabilir. login olup oturum açan her player, register olurken aldığı id'yi oturum boyunca kullanabilir :D

Winsock yardım

« Yanıtla #29 : 01.02.2010 07:10:53 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
bu doğru, ancak şöyle bir durum var. server'a bir connection request geldiği anda o connection'a özel bir obje yaratılıyor ve bu connection ile linkleniyor. sonrasında artık o clienta özel hiçbirşey üretilmese de onunla unique bir haberleşme sağlanabiliyor. kısacası hiçbir ID olmasa da o clientdan gelen paket diğer clientlarla karışmadan izole bir biçimde değerlendirilebiliyor server tarafında. ID'ye ihtiyaç duyulmasının nedeni tamamen diğer clientlarla ilgili. bir player hareket ettiği zaman diğer clientlara bunu bildirirken onun hangi player olduğunu bir biçimde ifade etmek gerekiyor. ancak authentication mecbur tutulmadan da o anda üretilmiş bir ID yeterli oluyor.