![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с блок. сокетами!!!! [D5, WinXP]
SidDN © (2003-09-10 14:10:00)
Мастера ХЕЛП!!!
Пишу клиент-сервер на блок. сокетах. Проблема в том, что на одних машинах есть глюк, а на других нет. Глюк заключается в том, что первый раз клиент обменивается данными с сервером нормально, а потом перестает, т.е. не устанавливается соединение с сервером. Хотя на некоторых машинах (и локально на одной) всё впорядке.
Целый день долбаюсь. Оси везде WinXP. Может у кого есть идеи, могу привести код.
Verg (2003-09-10 17:22:00) [21]
Я на XP не работаю (нет нигде под рукой), но
продпологаю вот что (wsacleanup):
> Verg © (10.09.03 15:57) [24]
Digitman (2003-09-10 17:14:00) [22]
для начала сделай так
procedure TComIOThread.Execute;
var
Stream:TWinSocketStream;
nRead,nRead1:integer;
TMP,s1:string;
begin
try
ClientSocket:=TClientSocket.Create(nil);
.... здесь все остальное
except
on E: Exception do НекаяПроцедураЗаписиПротоколаОбИсключенияхВПоточнойФункции (E.ClassName + " " E.message);
end;
end;
SidDN (2003-09-10 17:08:00) [23]
Согласен.
Ну а где всетаки "собака порылась"?
Почему не работает?
А можно попросить Вас выслать какой нибудь пример с работой блок. сокета. Хочу проверить машины. Тачки все вроде одинаковые, XP-я везде стоит. Нифига не пойму!
Digitman (2003-09-10 17:04:00) [24]
в ряде случаев, конечно, это и прокатит, но правильным будет вот так :
constructor TSomeDescendantOfThread.Create(параметры);
begin
inherited Create(True);
//здесь инициализируем свои поля на основании параметров
if not CreateSuspended then
Resume;
end;
Digitman (2003-09-10 17:03:00) [25]
в ряде случаев, конечно, это и прокатит, но правильным будет вот так :
constructor TSomeDescendantOfThread.Create(параметры);
begin
inherited Create(True);
//здесь инициализируем свои поля на основании параметров
if not CreateSuspended then
Resume;
end;
SidDN (2003-09-10 16:55:00) [26]
Параметры я опустил.
constructor TComIOThread.Create(CreateSuspended: Boolean; FDataShow:TDataShow;FAddress:string;FPort:word;FData:string);
А в чём проблема с FreeOnTerminated? Помоему здесь его ставить и надо.
Digitman (2003-09-10 16:42:00) [27]
отложим на время "высокие материи"
начнем с явной несуразицы
constructor TComIOThread.Create; // где параметры конструктора ?
begin
DataShow:=FDataShow; // ты же на них ссылаешься сдесь !
Data:=FData;
Address:=FAddress;
Port:=FPort;
FreeOnTerminate:=True; //почему идет ссылка на св-во еще неинициализированного объекта ?
inherited Create(CreateSuspended); // вот только здесь инициализация начинается !
end;
SidDN (2003-09-10 16:32:00) [28]
Прохожу строку
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
и все, на следующую строчку не переходит.
Через время выпадает окно CPU с точкой в функции DbgBreakPoint или DbgUserBreakPoint
Digitman (2003-09-10 16:26:00) [29]
> Поток засыпает при создании сокета
как это "засыпает" ? блокируется что ли на исполнении какой-то строчки ?
SidDN (2003-09-10 16:23:00) [30]
Протрассировал. Поток засыпает при создании сокета
procedure TCustomWinSocket.Open(const Name, Address, Service: string; Port: Word; Block: Boolean);
begin
if FConnected then raise ESocketError.CreateRes(@sSocketAlreadyOpen);
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP); <<---
if FSocket = INVALID_SOCKET then raise ESocketError.CreateRes(@sCannotCreateSocket);
...
...
SidDN (2003-09-10 16:14:00) [31]
Стоп. Я вобще про клиента говорю.
// Поток клиента
TComIOThread=class(TThread)
private
ClientSocket:TClientSocket; <-----------
Buffer:TMemoryStream;
InDataSize:integer;
Address:string;
Port:word;
Data:string;
protected
procedure Execute; override;
public
DataShow:TDataShow;
constructor Create(CreateSuspended: Boolean; FDataShow: TDataShow;FAddress:string;FPort:word;FData:string);
procedure Show;
end;
Digitman (2003-09-10 16:11:00) [32]
> если ClientSocket не прибить, он остаётся
и правильно остается. для повторного использования при коннекте со след.клиентом
> ClientSocket это не TServerClientWinSocket.
чушь. именно - TServerClientWinSocket
SidDN (2003-09-10 16:03:00) [33]
to Digitman © (10.09.03 15:57)
Проверял MemCheck-ом, если ClientSocket не прибить, он остаётся.
Да и ClientSocket это не TServerClientWinSocket.
SidDN (2003-09-10 15:58:00) [34]
Да, кстати, иногда при последующем запросе вываливается окно CPU с точкой в функции DbgBreakPoint или DbgUserBreakPoint
Digitman (2003-09-10 15:57:00) [35]
> И почему если закомментировать ClientSocket.Free начинает
> работать
а это, кстати, и не допустимо - самостоятельно разрушать объект TServerClientWinSocket
за его разрушение ответственен объект-диспетчер TServerWinSocket
в ClientExecute() же допустимо только метод TServerClientWinSocket.Close вызывать
Verg (2003-09-10 15:57:00) [36]
первый раз заходит, не спорю, я имею в виду последующие запросы
И в последующие заходит, а если не заходить значит гдето просто умирает (засыпает) внутри SetActive.
> И почему если закомментировать ClientSocket.Free начинает
> работать
Закоментаривая ClientSocket.Free ты по-сути убираешь WSACleanUp из приложения.
Если его оставить (Free, а значит WSACleanUp), то происходит деинициализация winsock. Между прочим, с этим тоже как-то может быть связано... (Порченный winsock на некоторых твоих машинах?)
Digitman (2003-09-10 15:54:00) [37]
> Verg
я - пока про серверную
SidDN (2003-09-10 15:51:00) [38]
to Verg © (10.09.03 15:46)
В первый раз заходит, не спорю, я имею в виду последующие запросы. DataShow, помоему ни причём, без нее тоже не работает.
И почему если закомментировать ClientSocket.Free начинает работать. А ведь на некоторых машинах всё работает и так нормально.
В чём может быть дело?
Verg (2003-09-10 15:48:00) [39]
> Digitman © (10.09.03 15:46) [19]
Подождите! Мы про какую часть говорим? Про клиентскую или про серверную?
Verg (2003-09-10 15:46:00) [40]
> Но в finally он действительно не заходит.
Не верю. Заходит.
Иначе никакое "зокментаривание" бы и близко не повлияло, не так ли?