Главная страница
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.03 c
2-1164103701
Term
2006-11-21 13:08
2006.12.10
Конвертация в Unicode


3-1159787864
ceval
2006-10-02 15:17
2006.12.10
Enter в DBgridе


6-1153402716
Каг дила?
2006-07-20 17:38
2006.12.10
проблемка IdSMTP


3-1159949002
Opilki_Inside
2006-10-04 12:03
2006.12.10
Как грамотно отменить изменения в конкретном поле в TADOQuery?


3-1159512584
vodvorezlaya
2006-09-29 10:49
2006.12.10
Трёхмерные таблицы