Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
10-1126181335
WhiteMag
2005-09-08 16:08
2006.12.10
Уничтожение сервера приложений


2-1164184870
vitv
2006-11-22 11:41
2006.12.10
Миграция с InterBase 6.1


4-1153839437
cando
2006-07-25 18:57
2006.12.10
прослушивание линии


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


15-1164184841
zdm
2006-11-22 11:40
2006.12.10
INDY attach





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский