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

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

Работа с сокетами (теория) [D7]


Страницы:   1 2

GanibalLector ©   (2009-07-02 16:51:00) 

Добрый день!

Имеется следующая задача. Есть девайсы, к ним подключены модемы.
В данный момент я дозваниваюсь к ним и обмениваюсь данными(через TAPI).
Все хорошо, все работает. Решили удешевить стоимость обмена , увеличить скорость обмена и перейти на GPRS.
Модемы прошили ( на работу с GPRS ), проверил все работает.

В связи с этим пару вопросов.

1) начитался я А.Б.Григорьева и не пойму. а какие сокеты выбрать ?
Блокирующие/не блокирующие (асинхронные на сообщениях,на событиях и т.д.)

Впервые работаю с сокетами.

2) есть готовый код, который работает. Как Вы понимаете, обмен у меня был по RS232.
Протокол обмена с девайсом не менялся. Я хочу максимально упростить переход с RS232 на сокеты(ибо кода много уже).

Т.е. в моем коде весь обмен сводится к одной ф-ции,  в которой есть ReadFile и WriteFile(для работы с RS232).
Вот ,например  :

procedure Request(Busy,NoWrite:Boolean; HPort: THandle;
 AddrPC, Addr, Cmd: Byte; const Data: string;
 out Status: TStatusRec; out Reply: string); overload;
var
...
begin
 if not Busy then
  Num := Byte(InterlockedIncrement(ncmd)) else
  Num:=  Byte(ncmd);
 Reply := '';
 Databuffer := FormatBuffer(AddrPC, Addr, Num, Cmd, Data);
 evOverlapped := CreateEvent(nil, True, True, nil);
 try
   if not WinCheck(SetCommMask(HPort, EV_RXCHAR or EV_ERR), Status) then Exit;

   if not NoWrite then
   begin
     ZeroMemory(@Overlapped, SizeOf(Overlapped));
     Overlapped.hEvent := evOverlapped;
     if not WinCheckOvr(WriteFile(HPort, Databuffer[1], Length(Databuffer),
       Transferred, @Overlapped), Status) then Exit;
     if not Wait(WriteTimeout, evOverlapped, Status) then Exit;
     if not WinCheck(GetOverlappedResult(HPort, Overlapped,
       Transferred, False), Status) then Exit;
   end;

   ...

 finally
   CloseHandle(evOverlapped);
 end;
end;


Т.е. я открываю порт и передаю в эту ф-цию хендл. А сама ф-ция что-то передает/принимает.

Что я хочу. Создам  сервер. Подключу клиента. В эту ф-цию передам сокет подключившегося клиента и изменю ReadFile|WriteFile на
на Recv , Send. Ну...это условно. Я понимаю, что этим конечно дело не закончится.

Правильный ли ход моих мыслей ?

Заранее спасибо !!!


Сергей М.   (2009-07-02 20:08:00) [21]


> GanibalLector


Впрочем, это к слову о минимальной переделке твоего кода, а не переписи его с нуля


Сергей М.   (2009-07-02 20:05:00) [22]

Страхи свои обрати к Антону, ибо жив и уважаем)


GanibalLector   (2009-07-02 17:23:00) [23]


> Вовсе не обязательно  изменять.ReadFile|WriteFile успешно
> работают и с сокетным транспортом, т.е. в эти ф-ции допустимо
> передавать параметром хэндл сокета.


Да, но тот же А.Б.Григорьев говорит следующее : специальных ф-ций для перекрытого ввода-вывода в WinSock1 не было, требовались ReadFile и WriteFile. В WinSock2 появилась полноценная поддержка перекрытого ввода-вывода для всех версий Windows...Здесь мы  будем рассматривать перекрытый ввод-вывод только в спецификации WinSock2, т.к. старый вариант из-за своих ограничений уже не имеет практического смысла

Вот что пугает !


Сергей М.   (2009-07-02 17:09:00) [24]


> В эту ф-цию передам сокет подключившегося клиента и изменю
> ReadFile|WriteFile на
> на Recv , Send


Вовсе не обязательно  изменять.
ReadFile|WriteFile успешно работают и с сокетным транспортом, т.е. в эти ф-ции допустимо передавать параметром хэндл сокета.


> понимаю, что этим конечно дело не закончится


Это да.
Поработать напильником придется изрядно)


> не пойму. а какие сокеты выбрать ?


Да любые)
Все равно напильником работать придется.

Блокирующий режим проще в алгоритмической реализации сокетного транспорта, но он блокирует кодовый поток на время выполнения ф-ций сокетного ввода/вывода.

Неблокирующий режим чуть посложнее в реализации, но он не блокирует кодовый поток.


GanibalLector   (2009-07-02 16:54:00) [25]

Небольшое уточнение.

Удаленные клиенты (в моем случаи) ничего сами по себе данные не передают. Т.е. я обязан выслать пакет и только после этого клиент ответит.


Страницы:   1 2

Наверх

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