Сейчас на форуме: _MBK_, UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Передача данных между локальными процессами
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 14:15
· Личное сообщение · #1

Задача:
передавать небольшие порции данных между процессами;
после передачи данные должны удаляться, чтобы не занимать память.

Вопросы:
использовать mailslot или pipe?
есть ли различия, если не считать одно- и двух- направленность?
с обоими надо использовать события?

У Рихтера ни про одно ни про другое толком не написано(
Несколько часов рылся в интернете - ни как не могу определиться)

З.Ы. Использовать файлы не вижу смысла, данные небольшие, да и копить их смысла нет.
З.Ы.Ы. или почта и пайп тоже накапливают данные?



Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 августа 2011 15:32 · Поправил: Wishmaster-zanyat
· Личное сообщение · #2

Во-первых свой косяк я нашёл: длинна пакета указывается в первом и частично во втором байтах, а не в первом.

Во-вторых немного оффтопа:
Code:
  1.          char *buff = new char [64 * 1024];
  2.          ZeroMemory(buff, 64 * 1024);
  3.  
  4.          int readsize = Receive(buff, 64 * 1024, MSG_PEEK);

При этом в buff будут данные, readsize - размер данных, но при этом данные из сокета не изымаются. Далее можно проанализировать что пришло, выделить память нужного размера и прочитать хоть 10, хоть 20 байт и т.д. Так вот при анализе этого блока можно видеть сколько пакетов пришло за раз, и не всегда пакет один. Судя по тому, что я на основе указанной длинны пакета читаю только этот пакет, после выхожу из OnReceive и софтина не валится и не виснет - непрочитанные данные остаются таки в сокете.

DenCoder Простите, мы институтов не кончали, всех технических формулировок не знаем, пишем программки для себя, денег на этом не зарабатываем. Мне удобно называть сокетом - я и назвал (надеюсь все поняли что я хотел спросить, а больше мне и не надо).

И хочу спросить ещё один вопрос (для тех, кто работал на MFC с CSocket): может ли OnReceive вызваться если пришёл не весь пакет? Например в первом байте содержится 0х20, а Receive() вернула 0х10, возможна ли такая ситуация?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 08 августа 2011 15:46 · Поправил: DenCoder
· Личное сообщение · #3

Wishmaster-zanyat пишет:
Простите, мы институтов не кончали

дык я тоже, есть MSDN и google

Wishmaster-zanyat пишет:
OnReceive вызваться если пришёл не весь пакет?

не может, если сокет неблокируемыйблокируемый - (очепятка)
Wishmaster-zanyat пишет:
Например в первом байте содержится 0х20, а Receive() вернула 0х10, возможна ли такая ситуация?

только если пакет так был передан, в ws2_32!send третьим аргументом длина. Если пакет сегментирован, то CAsyncSocket::Receive()->ws2_32!recv() не вернёт управление, пока весь пакет не соберёт или не возникнет ошибка. При ошибке принятая часть данных не доходит до пользовательского буфера.

UPDATED
ups... процесс может принять за раз несколько пакетов, если ожидаемая длина позволяет.

-----
IZ.RU




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 августа 2011 17:37
· Личное сообщение · #4

Ok, всё работает, но проверку на неполные данные всё же оставлю, вроде не критично)

Тему закрою, а то мы немного ушли от сабжа. Всем спасибо за участие и полезные советы


<< . 1 . 2 .
 eXeL@B —› Программирование —› Передача данных между локальными процессами
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати