![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с блок. сокетами!!!! [D5, WinXP]
SidDN © (2003-09-10 14:10:00)
Мастера ХЕЛП!!!
Пишу клиент-сервер на блок. сокетах. Проблема в том, что на одних машинах есть глюк, а на других нет. Глюк заключается в том, что первый раз клиент обменивается данными с сервером нормально, а потом перестает, т.е. не устанавливается соединение с сервером. Хотя на некоторых машинах (и локально на одной) всё впорядке.
Целый день долбаюсь. Оси везде WinXP. Может у кого есть идеи, могу привести код.
SidDN (2003-09-11 12:15:00) [1]
:))))
Спасибо большое за помощь!
Ну а насчёт XP - мне деваться некуда, надо писать под неё.
Буду разбираться... :(
Verg (2003-09-11 12:08:00) [2]
"А ведь говорил Мослатый Слизняку: держись, дурак, от канав подальше, а то ведь и хоронить нечего будет... " (С) Стругацкие
Это я про XP.
SidDN (2003-09-11 12:04:00) [3]
С оптимизацией и выравниванием - это я пробовал, думал может влияет както.
Твои exe-шники тоже глючат :(((((
Кстати на одной машине перебил операционку, начало работать.
Теперь остаётся выяснить в чём был бок.
Verg (2003-09-11 12:00:00) [4]
И это....,
по-моему ты рискуешь жестко нарваться с выравниванием. У меня, например исходники ScktComp (и не только) лежат в пути компиляции. И я могу с любым выравниванием работать.
Не уверен, но как гипотеза...
Verg (2003-09-11 11:55:00) [5]
Да, компилировано D6 - UpdatePack2.
Verg (2003-09-11 11:51:00) [6]
Лови.
Кстати, ты специально отключил оптимизацию и установил выравниване полей=1?
SidDN (2003-09-11 11:28:00) [7]
Слушай, а вышли мне exe-шники клиента и сервера (если не напряжно), может уменя компилер багует, только что пол предприятия оббежал, глючит стабильно!!! :(((
Verg (2003-09-11 11:05:00) [8]
> Кстати а ты Инди пробовал?
Пробовал давно, не понравилось. К тому времени, когда ОНО появилось у меня было уже достаточно наработок с Client/Server сокетами и я решил, что "свои баги ближе к телу" :))
SidDN (2003-09-11 11:01:00) [9]
Да это я Инди пробовал, убить забыл.
Наверное глюк в машинах всётаки, щас XP переставлю попробую опять.
Спасибо за помощь!!!
Кстати а ты Инди пробовал?
Verg (2003-09-11 11:01:00) [10]
> nRead1-length(s1) -2+1
конечно же
Verg (2003-09-11 10:58:00) [11]
Слушай а на кой там два штука TIdTCPClient? Мусор или перспектива?
Verg (2003-09-11 10:53:00) [12]
1. Проверил, работает. Хоть убейся работает. Даже на 98 (подвернулась тут....)
2. Модернизировал часть клиентского кода (извини, перевел на на Паскаль :)), а то "глаз режет") - тоже работает хоть убейся.
вот модернизированный кусок (из клиентской части)
ClientSocket.Socket.SendText(Data); // Посылаем запрос
SetLength(TMP, 65535);
if Stream.WaitForData(30000) then // Ждём ответ
begin
nRead1 := Stream.Read(TMP[1], length(Tmp));
if nRead1 = 0 then exit;
// Определяем размер данных
S1:=pchar(Tmp);
InDataSize:=StrToIntDef(S1,-1);
if InDataSize<=0 then exit;
Data:=Copy(TMP, length(s1)+2, nRead1-length(s1)+2+1);
while length(Data)<InDataSize do // Поучаем остальные
begin
if not Stream.WaitForData(30000) then exit;
nRead := Stream.Read(TMP[1], length(Tmp));
if nRead = 0 then exit;
Data:=Data+Copy(Tmp, 1, nRead);
end;
Synchronize(Show);
end else
begin
// TimeOut
end;
SidDN (2003-09-11 09:50:00) [13]
Послал.
Я уже в своём отделе операционки переставлять на двух машинах начал, может это поможет :)
Verg (2003-09-11 09:06:00) [14]
Ну, давай.
andruk@mail.ru
Прикольный глюк. Вот только нет у меня XP.
Кстати, клиентскую часть (поток) я вчера гонял. Ничего криминального. Ездил на Nt4 И W2K.
SidDN (2003-09-10 18:40:00) [15]
А давай я тебе проекты вышлю и ты у себя попробуешь?
SidDN (2003-09-10 18:34:00) [16]
Да по разному.Пробовал и подряд, и через время.
Дело в том, что первый запрос нормальным назвать нельзя, т.к. данные то приходят, а поток не убивается, и почему при запросе создаются 5-ть потоков? На рабочей машине создаётся всего один, и оный после отработки грохается.
Verg (2003-09-10 18:23:00) [17]
Между запросами серверу сколько проходит время (между первым с нормальным обменом и следующим "с умиранием")?
Они идут подряд?
SidDN (2003-09-10 17:43:00) [18]
В начале пакета идёт его длина в символьном виде, отделённая от пакета #0.
Напр.: "10"#0"1234567890"
В этом коде я выкусываю из пакета его длину:
SetLength(s1, StrLen(PChar(TMP))+1);
StrLCopy(@s1[1], PChar(TMP), Length(s1)-1);
InDataSize:=StrToInt(s1);
Delete(TMP, 1, Length(s1));
В приведённом примере StrLen(PChar(TMP)) вернёт 2.
Помоему все в порядке.
Verg (2003-09-10 17:35:00) [19]
> Можно по-подробнее...
Там более подробно некуда
Давай лучше поищем "ведьм" :)
> SetLength (TMP, nRead1);
> // Определяем размер данных
> SetLength(s1, StrLen(PChar(TMP))+1);
Объясни в этом куске - чего ты хош? Особенно StrLen - что вернет и почему? Как думаешь?
SidDN (2003-09-10 17:29:00) [20]
> Verg
Можно по-подробнее...