Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.53 MB
Время: 0.031 c
15-1163698600
ProgRAMmer Dimonych
2006-11-16 20:36
2006.12.10
Microsoft готова уйти из Китая


15-1163867719
XP UserR-rr
2006-11-18 19:35
2006.12.10
Васик, и все с ним связанное


2-1164482398
koha
2006-11-25 22:19
2006.12.10
Распознавание файлов?


15-1163794567
Витян
2006-11-17 23:16
2006.12.10
Микроконтроллер ATmega16


1-1161991895
Sp1r1t
2006-10-28 03:31
2006.12.10
Скажите плс. Как вывести список установленный программ?




   Наверх