Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с блок. сокетами!!!! [D5, WinXP]


Страницы:   1 2 3

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 он действительно не заходит.


Не верю. Заходит.
Иначе никакое "зокментаривание" бы и близко не повлияло, не так ли?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо