Socket ile gelen verileri değişkenlere nasıl atarım?

Yarin-oburgun oturup yazayim, oyle iki mesaj arasina yazilacak kadar kolay degil :confused:
Belki bi mikrokutuphane haline getiririz, pickle’la falan birlestirip.

Genel fikir soyle ama:

while okunan_byte < okunacak_byte:
    n, yeni_bytelar = read(okunacak_byte - okunan_byte)
    if (baglanti_koptu()) break;
    if (n == 0) // bu ozel bi durum muydu hatirlamiyorum
    okunan_byte += n; buffer += yeni_bytelar

Şu kullanım iş görür mü (bu örnek şuanda çalışmıyor, yeni hali için aşağıdaki gönderimi inceleyin):

#server.py
from microstream import Server, localhost

s = Server()
s.bind((localhost, 12345))
s.listen(1)

c = s.accept()
obj = c.recv()
assert obj == ["merhaba", "dünya", 1, -3.4, None]
#client.py
from microstream import Client, localhost

c = Client()
c.connect((localhost, 12345))

obj = ["merhaba", "dünya", 1, -3.4, None]

c.send(obj)

Parametre vermemek sadece bir baskasinin belirledigi default degeri vermekle esdeger malesef.

Loop olmadan nasil yapilabilecegini dusunemiyorum.

recv için mi? Mesajların uzunluğunu yolluyor en başta, sizin son bahsettiğiniz yöntem bu olmuyor mu?

Pardon, server’in socket.recv cagirdigini zannettim (ismini degistirmek iyi bir fikir olabilir). Microstream’e simdi bakiyorum:

recv'in 0, 1 byte dondurdugu durumlar handle edilmemis.

Twisted kütüphanesini denemek isteyebilirsiniz belki. Şurada TCP üzerinde çalışan server-client örnekleri verllmiş mesela.

read olur mu sizce?

TCP’de tek seferde n byte gönderdiğimiz halde recv(n) çağrısından hangi durumlar altında n’den daha kısa bir değer alıyoruz bilmiyorum (sadece bir taraf socketi kapatınca karşı tarafın hep b'' aldığını hatırlıyorum). Bir kaynak verirseniz veya açıklarsanız sevinirim.

Once receive dusundum fakat sonra send’in send ile karisacagini fark ettim. send/receive_object olabilir mesela. (Edit: soruyu cevaplamamisim. Evet, read/write da biraz dosya konotasyonlu olsa da gayet iyi bence.)

man 2 recv veya herhangi bir BSD soket implementasyonu dokumentasyonu.

Cunku bir suru dusuk seviye arayuzde oldugu gibi, belirtilmemis. Bunun sebebi asagidaki mekanizmalara ozgurluk saglamak. Datayi birlestirme/ayirma isini programciya birakarak isletim sisteminin yukunu hafifletiyor. Bu cagrinin internete bagli butun aletler icin tasarlandigini ve kullanildigini hatirlatirim. Python neden oldugu gibi almis en ufak bir fikrim yok.

Pratikte, tamamen tahmin yurutuyorum, data iki paket halinde gelirse olabilir mesela.

1 Beğeni

receive_object de iyi. read dersek send’i de write yapmak mantıklı olur tabii.

Aslında burayı okudum ama dediğiniz gibi hangi durumlarda eksik döndüreceğinden pek bahsetmemiş. Peki pratikte böyle bir duruma modern işletim sistemlerinde rastlanır mı sizce, ben hiç karşılaşmadım:

Evet, bahsetmemis.

Ben sabah tekrar bi bakmistim ve bahsediyor diye gormustum ama karistirmisim. Resmi spesifikasyonlar disinda her yerde acik acik yaziyor. Resmi spesifikasyonlar sadece “up to n bytes” diyerek ima ediyor.

Pratikte dedigim gibi en kolay paket ayrimlarinda karsimiza cikiyor. Google sonrasi cagda network konusunda feci optimizasyonlar ve hizlar gorduk, muhtelif TCP implementasyonlarina yapilan tweak’ler de bu durumu degistirebilir.

1 Beğeni

Bu arada soyle bir sey varmis, belki SSS yazmaktan da yirtarim.

1 Beğeni

Evet, orada bahsettiğiniz döngü için güzel bir örnek verilmiş. Ben de yazdığım modüle o döngüleri ekleyeceğim.

1 Beğeni

Kodu güncelledim, bu konuyu da SSS’e ekledim.

#server.py
from microstream import Server, localhost

s = Server()
s.bind((localhost, 12345))
s.listen(1)

c = s.accept()
obj = c.recv_obj()
assert obj == ["merhaba", "dünya", 1, -3.4, None]
#client.py
from microstream import Client, localhost

c = Client()
c.connect((localhost, 12345))

obj = ["merhaba", "dünya", 1, -3.4, None]

c.send_obj(obj)

Verdiğiniz bilgiler için de teşekkür ederim.

1 Beğeni