Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

сокеты и 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.044 c
15-1163714053
vasIzmax
2006-11-17 00:54
2006.12.10
Запароленные архивы


9-1139395378
TGX
2006-02-08 13:42
2006.12.10
gamedev


15-1163758988
Jeer
2006-11-17 13:23
2006.12.10
"Интервью с богом"


2-1162976091
first_may
2006-11-08 11:54
2006.12.10
Директива $IFDEF


2-1164062576
begin2
2006-11-21 01:42
2006.12.10
Как узнать загрузилась картинка функцией LoadFromClipBoardFormat