![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с TClientSocket
Gek1 © (2005-04-21 16:13:00)Помогите решить проблему с TClientSocket.
Использую неблокирующий режим. Проблема заключается в том, что иногда пакет, который я отправляю серверу - недоходит. Происходит это очень редко - пару раз в сутки. При этом TClientSocket не генерирует ни каких ошибок и продолжает работать дальше.
Код отправки пакета:
procedure TCharacter.GameSendSHex(SHex : String);
var I, Len: Integer;
Buff : PArray;
begin
if not GameClient.Active then Exit;
if Length(SHex) <= 1 then Exit;
Len := Length(SHex);
{Конвертируем SHex в Array of byte}
if (Len = 0) or (Len mod 2 <> 0) then
begin
AddToDebugLog(GetName+': '+'Error converting SHex to Array of byte'+ ' (Game Socket)');
Disconnect;
Exit;
end;
New(Buff);
for I := 0 to ((Len div 2)-1) do BufIn^[I] := StrToInt('$'+Copy(SHex, I*2+1, 2));
Len := Len div 2;
{Пытаемся отослать байтики серверу}
if GameClient.Socket.Connected then
begin
try
GameClient.Socket.SendBuf(BufOut^,Len);
AddtoDebugLog(GetName+': '+'Client send '+inttostr(Len)+' bytes: '+SHex);
{Здесь я отловлю пакеты, отсылка которых влияет на св-ства класса}
CheckOutgoingPackets(SHex);
except
AddToDebugLog(GetName+': '+'Exception in Socket.SendBuf');
end;
end
else AddToDebugLog(GetName+': '+'You try send to shard some bytes, but you not Connected');
Dispose(Buff);
Dispose(BufOut);
end; {End TCharacter.GameSendSHex}
В итоге у себя я вижу что отправлен пакет, а со стороны сервера его нету. Если это транспортная проблема, то почему нету ошибки?
Подскажите пожалуйста в чем может быть проблема.
Gek1 (2005-04-21 17:32:00) [21]Яндекс подсказал, что надо проверять SendBuf() = SOCKET_ERROR
Что в этом случае делать? заново повторять?
А может ли отправится неполный кусочек буфера? :-)
Gek1 (2005-04-21 17:28:00) [22]
> и нафих ты себе геморрой с Д2005 заработал - ума не приложу)
Я перешел на 2005 из-за удобства сворачивания кода.
Может кто-то привык к большим обьемам - а мне, к сожалению, тяжело 15 тысяч строк кода листать вручную. Разбивка по модулям не помогает. :-(
Digitman (2005-04-21 17:22:00) [23]и нафих ты себе геморрой с Д2005 заработал - ума не приложу)
Gek1 (2005-04-21 17:15:00) [24]
> справку-то почитать - не судьба ?
Не повезло мне с Делфи. Имею Д2005 триал. А справки там нету :-(
Была бы - второй топик бы не создавал.
Д2005 выкинуть не могу. Слишком много кода. Без сворачивания кода - умру. :-(
Перерыл здесь статьи - тоже молчат как партизаны.
Digitman (2005-04-21 16:56:00) [25]
> SendBuf возвращает число. Что это число значит?
справку-то почитать - не судьба ?
ну не позорься уж ..
вроде при голове ты мужик ...
Gek1 (2005-04-21 16:52:00) [26]
> Digitman
SendBuf возвращает число. Что это число значит? Кол-во отправленных байт?
Скажи пожалуйста - как лучше сделать в моей ситуации?
Digitman (2005-04-21 16:31:00) [27]
> Использую неблокирующий режим
> GameClient.Socket.SendBuf(
ГДЕ анализ результата, возвращаемого этой ф-цией ?
Нет его !
Все твои проблемы растут вокруг этого.
Gek1 (2005-04-21 16:15:00) [28]
> Dispose(BufOut);
Это не ошибка а опечатка. Этой строки нету.