Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Внизсокеты и web service Найти похожие ветки
← →
Anatoly Podgoretsky © (2006-11-19 20:32) [40]> Lesorub (19.11.2006 20:22:39) [39]
Думаем, что нет, поскольку cgi это обычное консольное приложение
← →
Lesorub © (2006-11-19 20:52) [41]хм, но что же тогда, почему же ошибка возникает когда сокету дается время (пауза 10 сек) на открытие
← →
Сергей М. © (2006-11-20 08:10) [42]
> Lesorub © (19.11.06 20:52) [41]
Не надо сокету давать никакую "паузу".
Либо установи ctBlocking, либо органигуй цикл ожидания/выборки/диспетчеризации оконных сообщений.
← →
MikePetrichenko © (2006-11-20 10:03) [43]
> НО! Теперь пишет, после того как поставил паузу, ошибку
> показывает такую: InternalServerError (500)
Правильно пишет.
Вообще это идиотизм, использовать асинхронные сокеты с процедурой задержки, уж простите.
Пользуй либо синхронные, либо события OnConnect OnDisconnet.
P.S. В дельфе асинхронная работа сокетов сделана на основе оконных сообщений (что ни есть гуд для CGI). Следствие. Пиши ручками с использование Event, либо пользуй синхронные, либо события.
← →
Lesorub © (2006-11-25 11:21) [44]Читал много. Размышлял.
В общем, действительно это глупость использовать задержку. Совершенно согласен теперь с тем, что, в случае асинхронных сокетов, надо писать класс с эвентами, чтобы обрабатывать те самые оконные сообщения, либо использовать синхронные. Сначала пробую использовать синхронные. Причем решил не использовать vcl, а использовать api-функции winsock, поскольку в этом случае приложение как-то более контролируемо.
Делаю подготовку так:
if wsastartup($101,vwsadata)<>0 then halt(1);
vsocket := socket(af_inet,sock_stream,ipproto_ip); //создается сокет
if vsocket = invalid_socket then halt(1);
fillchar(vsockaddr,sizeof(tsockaddr),0);
vsockaddr.sin_family := af_inet;
vsockaddr.sin_port := htons(cport);
vsockaddr.sin_addr.s_addr := inet_addr(ip);
if connect(vsocket,vsockaddr,sizeof(tsockaddr)) = socket_error then halt(1);
//затем отсылаем данные
send(vsocket,buf[1],length(buf),0);
//затем надо принять ответ
recv(vsocket,chresp,1,0);
То есть хочу считывать по одному байту, и с этой целью надо поместить recv в цикл. И вот тут как определить сколько данных пришло в сокет?
А так вроде работает. Как думаете, правильно так делать?
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.042 c