Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Winsock2 + TThread 
:(
    Опции темы
Zib
  Дата 13.12.2007, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Господа, доброго времени суток!
Пишу небольшой демо TCP сервер с использованием WinSock2. Сокет использую в блокирующем режиме. Для того, чтобы сокет не блокировал основной поток ф-я Accept вызывается в отдельном потоке TServerAcceptThread. Ф-я Recv также вызывается в отдельном потоке TServerRecvThread.
У принимающего коннекты потока есть событие - OnClientConnected, у читающего сокет - OnClientDisconnected и OnClientReceiveData. Для чего они полагаю понятно из названия.

Суть проблемы:
По непонятным причинам выкидывается AccessViolation в момент, когда клиент начинает слать данные. Думал, что проблема в том, что процедура события вызывается из потока несинхронизированно. Сихронизировал. Эффект = 0  smile 

Второй день бьюсь  smile немогу понять в чем дело. Поможите советом, плз.

Сырцы проекта прилагаю.

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  CSDemo.rar 28,17 Kb
PM MAIL   Вверх
MetalFan
Дата 13.12.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



для передачи в кач.нетипизированного параметра дин.массивов и длинных строк надо использовать
их первый элемент.
не так:
Код

    FBuffer: array of byte;
...
    len := recv(Socket, FBuffer, FBufferSize, 0);

а так:
Код

    FBuffer: array of byte;
...
    len := recv(Socket, FBuffer[0], FBufferSize, 0);

пока это в глаза бросилось. посмотри подобные ошибки по коду

Добавлено через 10 минут и 21 секунду
так же идет асинхронное обращение к vcl в событиях HandleClientDisconnected, HandleClientReceiveData.
можно "обернуть" 
Код

procedure TncTcpServer.AddToLog(s: string);
begin
  //здесь добавить вход в крит.секцию
  frmServer.Memo.Lines.Add('[' + Self.ClassName + '] - ' + s);
  //здесь добавить выход из крит.секции
end;


также просто немного криво выглядит код:
Код

procedure TncTcpServer.HandleClientReceiveData(Socket: TSocket;
  buf: array of byte; len: integer);
var
  s: string;
  i: integer;
begin
  AddToLog('Handle client receive data');
  SetLength(s, len);
  for i := 0 to len - 1 do
    s[i+1] := chr(buf[i]);
  AddToLog(s);
end;

len вообще не нужен, ибо и так нам известна длина дин.массива
достаточно имхо такого кода:
Код

procedure TncTcpServer.HandleClientReceiveData(Socket: TSocket;
  buf: array of byte; len: integer);
var
  s: string;
begin
  AddToLog('Handle client receive data');
  SetString( s, PChar(buf[0]), Length(buf));
  AddToLog(s);
end;


Добавлено через 11 минут и 5 секунд
p.s. удачи


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zib
Дата 13.12.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата(MetalFan @  13.12.2007,  11:59 Найти цитируемый пост)
для передачи в кач.нетипизированного параметра дин.массивов и длинных строк надо использоватьих первый элемент.не так:код Pascal/Delphi1:2:3:    FBuffer: array of byte;...    len := recv(Socket, FBuffer, FBufferSize, 0);highlightSyntax('delphi_zZGM','delphi');highlightSyntax('delphi_zZGM','delphi');а так:код Pascal/Delphi1:2:3:    FBuffer: array of byte;...    len := recv(Socket, FBuffer[0], FBufferSize, 0);highlightSyntax('delphi_MmRhOD','delphi');highlightSyntax('delphi_MmRhOD','delphi');пока это в глаза бросилось. посмотри подобные ошибки по коду

Мммм.... Точно! Тупанул ащще  smile 
Собственно в этом и была проблема. Смутило именно то, что AccessViolation выскакивал не каждый раз, а както нерегулярно. Т.е. мог выскочить, а мог и нет.

В любом случае огромное спасибо, камрад! Буду внимательнее  smile 


PM MAIL   Вверх
Zib
Дата 13.12.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Да, и совсем забыл еще спросить: как этот метод (на каждого клиента свой читающий поток) себя поведет в случае, если будет 100 клиентов, а 1000? Или тогда используются другие методы?
PM MAIL   Вверх
MetalFan
Дата 13.12.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Zib, пулы потоков, порты завершения.
ищи по Thread Pool, IO Completion port


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zib
Дата 14.12.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Ща начну клянчить smile
Если кто располагает примером работы с IO Completion port на Дельфи поможите, буду весьма признателен!
PM MAIL   Вверх
MetalFan
Дата 14.12.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



есть же примеры несложные на C...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zib
Дата 14.12.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



к сожалению сям необученыС...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.