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

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

Проблема с TClientSocket


Страницы:   1 2

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);

Это не ошибка а опечатка. Этой строки нету.


Страницы:   1 2

Наверх

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