![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с сокетами (теория) [D7]
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]Небольшое уточнение.
Удаленные клиенты (в моем случаи) ничего сами по себе данные не передают. Т.е. я обязан выслать пакет и только после этого клиент ответит.