Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2010, 12:52   #1
Master255
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 11
По умолчанию Приоритет обработки сокетов

Проблема в том что при отправке данных через сокет сначало всё нормально, но если запустить ёмкую программу, то обработка отправки прерывается. Прерывание возможно происходит на миллисекунды, но это критически важно. Что бы не было прерываний. Передаётся звук. Как увеличить приоритет отправки (send) и приёма данных.

Вот листинги того что есть сейчас:
Отправка буфера:
Код:
function WlanSendBuffer(Buffer: Pointer; DataSize: Integer): Boolean;
var
  AmountSent: Integer;
  Position : Integer;
  BytesLeftToWrite: Integer;
  BytesToWrite: Integer;
  DataPointer: PByte;
 // arg1:u_long;
begin
  sendr:=false;
  DataPointer := Buffer;
  Position := 0;
  BytesToWrite := 0;
//  arg1:=1;
// IOCtlSocket (SocketHandle,FIONBIO,arg1);
  while (Position < DataSize) do
  begin
    BytesLeftToWrite := DataSize - Position;
    if (BytesLeftToWrite > 0) then
    begin
      if BytesLeftToWrite > 2048 then
        BytesToWrite := 2048
      else
        BytesToWrite := BytesLeftToWrite;
    end;

    AmountSent := send(ClientHandle, DataPointer^, BytesToWrite, 0);

    if (AmountSent = SOCKET_ERROR) then
    begin
      Result := False;
      Exit;
    end;

    Inc(DataPointer, AmountSent);
    Position := Position + AmountSent;
  end;
//  arg1:=0;
// IOCtlSocket (SocketHandle,FIONBIO,arg1);
  Result := True;
  sendr:=true;
end;
Создание сокета:
Код:
function WlanStartServer() : Boolean;
var
  arg: Integer;
  IPs: String;
begin
  Result := False;

  WSAStartup($101, WSADataStruct);

  // Create socket
  SocketHandle := Winsock.socket(PF_INET, SOCK_STREAM, 0);

  if (SocketHandle = INVALID_SOCKET) then
  begin
    MessageDlg('socket() failed!', mtError, [mbOK], -1);
    Exit;
  end;

  // Bind socket
  SockAddr.sin_family := AF_INET;
  SockAddr.sin_addr.S_addr := INADDR_ANY;
  SockAddr.sin_port := htons(17584);

  if (bind(SocketHandle, SockAddr, sizeof(SockAddr)) = SOCKET_ERROR) then
  begin
    MessageDlg('The port used by the PSPdisp server is in use. Probably another instance is already running.', mtError, [mbOK], -1);
    //MessageDlg('bind() failed!', mtError, [mbOK], -1);
    Exit;
  end;

  // Start listening, only accept 1 client (0 clients in backlog)
  if (listen(SocketHandle, 1) = SOCKET_ERROR) then
  begin
    MessageDlg('listen() failed!', mtError, [mbOK], -1);
    Exit;
  end;

  arg := 1000;
  setsockopt(SocketHandle, SOL_SOCKET, SO_RCVTIMEO, @arg, sizeof(arg));
  setsockopt(SocketHandle, SOL_SOCKET, SO_SNDTIMEO, @arg, sizeof(arg));

  // Show "Server started" message
  IPs := GETAllIPAddresses();
  MainForm.OptionsWlanAddress.Caption := Ips;


  if MainForm.OptionsWlanNotifyStart.Checked then
    MainForm.ShowBalloonHint('PSPdisp: Server started', 'Please connect your PSP to the following IP address:' + #10 + Ips, bfInfo);

  Result := True;
end;

From artemavd: я перенесу тему в нужный раздел. Можно да она будет здесь находиться?

Последний раз редактировалось artemavd; 02.07.2010 в 03:09.
Master255 вне форума Ответить с цитированием
Старый 28.06.2010, 17:09   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

похоже вы решили старую тему выдать с новой формулировкой
1- windows не система реального времени
2- использование tcp подразумевает фрагментацию пакетов, плюс идет влияние загруженности канала
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.06.2010, 17:40   #3
Master255
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 11
По умолчанию

ту тему можно закрыть. Многое изменилось с тех пор.

Если не загружать компьютер и не запускать ничего, то звук передаётся без зависаний. Как сохранять это стабильное состояние?
Как уменьшить фрагментацию tcp? Может использовать другой протокол? Функции есть может какие для сокетов? Буфер увеличить какой? Но что бы распаковка винрара не мешала и не вызывала заиканий? Как это сделать?
Master255 вне форума Ответить с цитированием
Старый 28.06.2010, 18:23   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

посмотрите про передачу по udp протоколу)))
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 28.06.2010, 20:19   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Многое изменилось с тех пор.
...так что же изменилось? проблема все та же, сколько нужно повторить, что виндовс не реалОС ? ...ну, приведу более приземленный пример: при загрузке проца или включенном торренте (кстати он по udp) и скайп заикается, а ведь его разработчики никак "не дураки" или вы иного мнения?

...udp согласен, сам пользую, но проблема останется + возможны выпадения пакетов, что для речи не особо критично ...гляньте темку http://www.programmersforum.ru/showthread.php?t=91506 и http://raxp.radioliga.com/cnt/s.php?p=ib7.pdf и http://raxp.radioliga.com/cnt/s.php?p=voip.pdf
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.06.2010 в 20:26.
raxp вне форума Ответить с цитированием
Старый 28.06.2010, 20:59   #6
Master255
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 11
По умолчанию

тогда как оказалось было 2 проблемы...1. захват звука происходил в малый буфер. Из за этого звук заикался. Исправлено большим буфером захвата.
2. Передача звука. 2 - проблема осталась.
По usb звук передаётся отлично! Даже при полной загрузке компа всевозможными сервисами. Объясняется более малыми задержками нити с send. По проводам send бегает быстрей. Поэтому текущего буфера хватает. Но хочется по wi-fi. Думаю нужно увеличивать количество передаваемой информации за раз. Это компенсирует задержки wi-fi.
Но как программист, я понимаю что это всё костыли. В теории приоритет можно сделать. Может это будет необъяснимо сложно, но можно! Вот я и спрашивал. Вдруг это можно легко или кто знает как??

Если у скайпа есть задержки, то пусть переходят на делфи. У меня по проводам нет задержек! Абсолютно! :-D
Master255 вне форума Ответить с цитированием
Старый 28.06.2010, 21:12   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а вы в курсе, что скайп на delphi ...кстати, delphi-то тут причем

...wlan канал точка-доступа-клиент или клиент-клиент (ppp) вносят еще дополнительную задержку в канал и фрагментацию, особенно при использовании шифрования и/или наличия соседей по радиоканалу ...вообще, скоростная передача по wi-fi давно отработана для IPTV, при этом используется мультикаст, НО вот поддерживает-ли его PSP/

p.s.: мой VoIP телефон-шлюз по UDP поверх wi-fi радиоканала при загрузке проца кстати працюэ, однако задержка сигнала начинает заметна проявляться при загрузке самого канала, частично помогает снижение битрейта потока ...но, как уже говорил в ссылках, хочешь качества для voip - обеспечь канал ...скайп, к слову, так и "приспосабливается" к каналу.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.06.2010 в 21:25.
raxp вне форума Ответить с цитированием
Старый 28.06.2010, 21:16   #8
Master255
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 11
По умолчанию

хм...наверно мне нобелевку надо давать когда я решу эту проблему увеличением пересылаемых данных за раз или сжатием данных...
Master255 вне форума Ответить с цитированием
Старый 28.06.2010, 21:32   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

дерзайте ...а вы разве не используете сжатие звукового потока перед передачей? я использую кодеки Lernout4/8 и GSM6.10, в планах 7.29 прикрутить.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.06.2010, 22:02   #10
Master255
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 11
По умолчанию

неа...а зачем? аудио и так летает нормально! только заикается изредко.
+ко всему программу писал не я+для захвата используется хитрая библиотека на с+++ больше использования Cpu что важно. Поэтому прикручивать сжатие будем в последнюю очередь...при острой необходимости
Master255 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приоритет процесса P@SH@ Win Api 9 13.05.2014 21:48
приоритет в ЛВС Mortalisrain Помощь студентам 7 27.05.2010 09:01
Приоритет функций Utkin Общие вопросы по программированию, компьютерный форум 27 09.12.2009 10:40
Приоритет макроса ru3000 Microsoft Office Excel 4 02.09.2009 04:45
Приоритет Михаил Юрьевич Win Api 5 15.07.2008 23:23