Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как грамотно работать с сокетами


Страницы:   1 2

Piter ©   (2005-08-19 15:16:00) 

Пишу плагин для программы. С WinApi приходится работать через внутренний API программы, но фактически это реализается блокирующих сокетов.

Вот думаю - как лучше организовать прием/передачу данных.

Допустим, я сделал поток - он принимает данные, в какой-то момент поток "завис" на Receive (данных нету).
А если в это время надо что-то отправить? Делать другой поток?
То есть, прием данных в одном потоке, передача в другом? Или как это грамотно реализовать?


Lamer@fools.ua   (2005-08-21 12:44:00) [1]

>> Piter ©   (20.08.05 18:57) [25]

> Правильно говорить "Дельфай". Тоже самое и с Xerox.

Если говорить на манер англоязычных пиплов, не учивших историю, то непонятно, откуда взялся мягкий знак. Если же говорить на манер людей хоть немного помнящих историю Древней Греции, то правильно (или по крайней мере общепринято) говорить "Делфи" либо на русский манер "Дельфи".

А насчет Xerox'а - да. Правильно, всё-таки, говорить "Зирокс" (ударение на последнем слоге).


Piter   (2005-08-21 00:17:00) [2]

Alexander Panov ©   (20.08.05 23:53) [28]

Так и я о том же.

А на самом то деле - правильно по другому.


Alexander Panov   (2005-08-20 23:53:00) [3]

Где, в России? :)

Уг. именно.


Piter   (2005-08-20 23:20:00) [4]

Alexander Panov ©   (20.08.05 19:44) [26]
Правильно Делфи


Где, в России? :)


Alexander Panov   (2005-08-20 19:44:00) [5]

Piter ©   (20.08.05 18:57) [25]
Правильно говорить "Дельфай".


Неправильно. Правильно Делфи.


Piter   (2005-08-20 18:57:00) [6]

Lamer@fools.ua ©   (20.08.05 18:12) [24]

Правильно говорить "Дельфай". Тоже самое и с Xerox.

Но почему-то никто не придирается...


Lamer@fools.ua   (2005-08-20 18:12:00) [7]

>> Piter ©   (20.08.05 17:37) [23]

> И называть компанию Xerox "Ксерокс" - тоже неверно.

Компанию называть "Ксерокс" как раз правильно, если на то пошло. А аппарат - не "Ксерокс", а "копир".

Насчёт Delphi вообще не понял, что имелось в виду...

P.S. Ладно. Завязываем с оффтопом :-)


Piter   (2005-08-20 17:37:00) [8]

Lamer@fools.ua ©   (20.08.05 14:57) [22]
В народе часто говорят ping/пинг, но это неправильно


я говорил об этом. Но коли уж приелось...

Дельфи - это тоже неправильно.

И называть компанию Xerox "Ксерокс" - тоже неверно.


Lamer@fools.ua   (2005-08-20 14:57:00) [9]

>> Piter ©   (19.08.05 17:09) [12]

> пинг (ping - пакетный Интернет-щуп) есть ничто иное как инф.обмен по протоколу icmp

я всегда думал иначе :(
Эхо-запрос и эхо-ответ - это обмен по icmp. А понятия Ping в протоколе icmp нету.

Ping - это просто название программы, которая реализовывает эхо-запросы и ответы по протоколу icmp.

Я же под пингом имел более широкое понятие - время дохода пакета от одного хоста к другому. Но так как говорить "время дохода пакета од одного компьютера до другого" слишком долго, то проще - Ping.


В народе часто говорят ping/пинг, но это неправильно. Правильно latency/задержка.


Piter   (2005-08-20 11:59:00) [10]

Defunct ©   (20.08.05 4:41) [20]
Ты с сетью работаешь через программу для которой пишешь плагин?


да, именно так. Да, пишу плагин для Miranda.

"Вот думаю - как лучше организовать прием/передачу данных."

Вообще не к месту, т.к. прием/передача данных в миранде уже реализованы


да? А ты писал плагины к ней? Фактически там реализованы блокирующие сокеты, о чем я и написал.

Defunct ©   (20.08.05 4:41) [20]
если в программе уже есть API для работы с сетью, тогда зачем использовать что-то еще?


а я и не использую


Defunct   (2005-08-20 04:41:00) [11]

Piter ©   (20.08.05 00:11) [19]

Читая ветку, я так понял у тебя есть только одна проблема - привязка к API программы. Если убрать эту привязку (чит. причину) пропадет и проблема (чит. следствие).

Ты с сетью работаешь через программу для которой пишешь плагин? Или плагин предназначен для работы с сетью этой программы. Как-нибудь поясни задачку-то, а то от прочтения сложилось такое впечатление, что ты дурью маешься. Какие-то пинги, таймауты по 500ms, когда в инете может быть и 20000ms, черт-те что. Неблокирующий режим нельзя потому что исп. Socks. Каша какая-то.

Socks вообще никакого влияния на твою программу не окажет. Socks обеспечивает тебе связь на сеансовом уровне.

С другой стороны, если в программе уже есть API для работы с сетью, тогда зачем использовать что-то еще?

Короче если ты пишешь плагин для миранды, а скорее всего именно для нее ты его и пишешь. То твой изначальный вопрос:

"Вот думаю - как лучше организовать прием/передачу данных."

Вообще не к месту, т.к. прием/передача данных в миранде уже реализованы.


Piter   (2005-08-20 00:11:00) [12]

Defunct ©   (19.08.05 23:31) [18]

Какие еще советы будут?
Может, Windows удалить?


Defunct   (2005-08-19 23:31:00) [13]

> Piter ©  

Выброси API программы к мохнатой бабушке.


Piter   (2005-08-19 18:44:00) [14]

FireMan_Alexey ©   (19.08.05 18:32) [16]
Тебе говорят, что если ты пишеш под винду, то пользуйся не блок режимом


отправляю еще раз перечитать мои посты [0] и [3]


FireMan_Alexey   (2005-08-19 18:32:00) [15]

>Piter
Тебе говорят, что если ты пишеш под винду, то пользуйся не блок режимом.
Сам когда-то бился головой как прокси написать :)

Вот пример отсюда отталкивайся!

Function GetEvent(Event,FD_XXX:Integer):Boolean;
Begin
 Result:=(Event and FD_XXX)<>0;
End;
...
Event:=WSACreateEvent;
 WSAEventSelect(Socket,Event,FD_READ or FD_WRITE or FD_CLOSE);
 //-------------------
While not Terminated do
Begin
     Index:=WSAWaitForMultipleEvents(1,@Event,False,10{Таймаут},False);
     Case Index Of
       0:Begin
           Error:=WSAEnumNetworkEvents(Socket,Event,@NetEvents);
If GetEvent(NetEvents.lNetworkEvents,FD_READ) Then
             Begin
Recv(...)
End;
If GetEvent(NetEvents.lNetworkEvents,FD_WRITE) Then
Begin
Send(...)
End;
... и т.д.


Piter   (2005-08-19 17:35:00) [16]

Digitman ©   (19.08.05 17:24) [13]
пардон, таймаут задается в select()


да... но я что-то никак логику оформить не могу.

1) Итак, я делаю Connect.

2) делать Recv не имеет смысла, он вернет -1.
 Поэтому логично использовать Select. Но куда handle писать? На чтение, на запись, на исключение?

Допустим, на запись

3) Select отдал управление. А дальше что? Писать? А если нечего писать? Тогда на чтение ставить?

Так и чередовать Select'ы - с чтения на запись?

Не могу строгую логику построить...


Piter   (2005-08-19 17:31:00) [17]

Digitman ©   (19.08.05 17:24) [13]
и какой смысл его измерять ?


практический смысл - Online сервер учитывает задержку при стрельбе, например. Чтобы участники были в более-менее равных ситуациях.

На клиентской стороне время пинга тоже показывается - просто для информации.

Например, вижу, что пинг колеблется в районе 50 - нормально играю.

А если на каком-нибудь сервере вижу пинг около 300 - то там и делать нечего.

Пинг вещь не постоянная, но при обычном коннекте и без всяких ЧП его среднестатическое значение секунд за 5-10 практически не меняется, +-10


Digitman   (2005-08-19 17:24:00) [18]


> ведь в recv никакого таймаута не задается


пардон, таймаут задается в select()


> время дохода пакета от одного хоста к другому


и какой смысл его измерять ?
величина эта колеблющаяся, зависит от множества факторов
спрогнозировать ее в реальных условиях глоб.сети для практического использования вряд ли возможно да и вряд ли нужно

что из того , что ответ на icmp-запрос пришел не через 10 мс (как на предыдущий запрос), а через, скажем, 11 мс ? "задержка" в 1 мс абсолютно ни о чем не говорит


Piter   (2005-08-19 17:09:00) [19]

Digitman ©   (19.08.05 16:44) [10]
разберись уже в конце-концов в терминологии и протоколах ..

пинг (ping - пакетный Интернет-щуп) есть ничто иное как инф.обмен по протоколу icmp


я всегда думал иначе :(
Эхо-запрос и эхо-ответ - это обмен по icmp. А понятия Ping в протоколе icmp нету.

Ping - это просто название программы, которая реализовывает эхо-запросы и ответы по протоколу icmp.

Я же под пингом имел более широкое понятие - время дохода пакета от одного хоста к другому. Но так как говорить "время дохода пакета од одного компьютера до другого" слишком долго, то проще - Ping.

ПО-моему, достаточно общепринято:

- Какой у тебя пинг
- У меня 25

Хотя если придраться - то диалог неправильный :)


Piter   (2005-08-19 17:05:00) [20]

хм...

Digitman ©   (19.08.05 15:25) [2]
то используй таймаут ожидания чтения - по истечению таймаута recv() вернет управление


а ведь в recv никакого таймаута не задается...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо