blocking vs nonblocking socket

8 отговора 254 прегледа
#1

blocking vs nonblocking socket

nqkoj da ima ideq koe e po dobre da se polzva blocking ili nonblocking socket.

Отговор
в отговор на KpyM #2

Re: blocking vs nonblocking socket

nqkoj da ima ideq koe e po dobre da se polzva blocking ili nonblocking socket.

Зависи какво правиш... В повечето случаи е по-добре да блокираш докато не пристигне нещо за четене. Това обаче означава да имаш повече от една нишка или процес, за да не ти блокира цялата програма.

Ако имаш само един процес и непрекъснато обикаляш сокетите, да не би нещо да е пристигнало, натоварваш излишно процесора.

Писането може да става и неблокиращо, стига да не разчиташ, че щом нещо си записал, оттътък е получено.

Отговор
в отговор на hoopla #3

Re: blocking vs nonblocking socket

da re4em 4e situaciata e takava 4e postoqnno moze da mi se nalozi da polu4a ili da izprata nesto.
dali da imam 2 treda sas blocking socket (za recv i send) ili edin sas nonblocking.

Отговор
в отговор на hoopla #4

Re: blocking vs nonblocking socket

niama nujda da e non-blocking socket-a za da rabotish w poweche ot 1 socket ot 1 process -- select(2) i poll(2) sa za towa :)

AFAIK towa dali socket-a e blocking ili ne ne wliaie na pisaneto -- to e non-blocking dokato se napylniat buferite -- sled towa triabwa da chakash da se izprazniat :)

Отговор
в отговор на KpyM #5

Re: blocking vs nonblocking socket

zawisi kato cialo ot programata, no na unix az bih go napravil sys 1 thread, blocking sockets i select

Отговор
в отговор на l #6

Re: blocking vs nonblocking socket

ima nuzda ako iskas da pro4etes kvo ti prastat a v sastoto vreme se opitvas prez 10 sec da vrastat "boza golqma" primerno.
ako sa v edin tred recv se me blokira dokato ne polu4i nesto ako e blocking.

Отговор
в отговор на KpyM #7

Re: blocking vs nonblocking socket

Не, не 1 или две нишки, а една, или n+1. Предполагаме, че правиш сървър, към който се закачат n клиента. В такъв случай правиш една главна нишка и n други, всяка от които спи, блокирана на отворен сокет. Когато нещо се появи на сокета, ядрото буди съответната нишка, за да си свърши работата. Можеш да създаваш нишките, когато отваряш нов сокет, или да държиш набор от създадени нишки, които да поемат новопоявилите се клиенти.

Това е за предпочитане пред една нишка, която да обикаля сокетите като болна и да пита: "Има ли нещо за мен, или да дойда по-късно?"

Ако може и да пратиш, без да са ти поискали нищо, значи не става въпрос за модел клиент/сервитьор, а за нещо от сорта на peer-to-peer, т.е. равнопоставени участници.

Във всеки случай, виж първо разликата между select и poll, а чак след това мисли за recv/send.

Отговор
в отговор на l #8

Re: blocking vs nonblocking socket

niama nujda da e non-blocking socket-a za da rabotish w poweche ot 1 socket ot 1 process -- select(2) i poll(2) sa za towa :)

Да, няма нужда, но е за предпочитане дизайнът на сървъра да е конкурентен, а не итеративен. Иначе даден клиент трябва да чака докато се обслужат всички преди него. Ако се обменят големи обеми данни, всички клиенти чакат един, за да им обърнат внимание на тяк. Представи си един ftp сървър, който обслужва само по един клиент наведнъж , а всички останали потропват нервно и си поглеждат часовника :) През това време не само процесорът на сървъра върти палци, но и линията не се използва ефективно, ако предположим, че фунията му е по-голяма от тази на клиента, какъвто обикновено е случаят.

Отговор
в отговор на KpyM #9

Re: blocking vs nonblocking socket

brato,
zemi napravi design niakakyv kakvo se iska ot servera kakvo ot clienta,
to shte ti izko4i kakvo triabva da izpolzvash.
no e lesho pyrvo da pro4etesh hubavo kakvo to4no predlagat berkley sockets i winsock-a
multithread tcp server ili single thread udp
glavno tova sa konfiguraciite kojto triabva da programirash

Отговор