
28.06.2010, 13:31
|
Прохожий
|
|
Регистрация: 28.06.2010
Сообщения: 8
Репутация: 10
|
|
Приоритет обработки сокетов
Проблема в том что при отправке данных через сокет сначало всё нормально, но если запустить ёмкую программу, то обработка отправки прерывается. Прерывание возможно происходит на миллисекунды, но это критически важно. Что бы не было прерываний. Передаётся звук. Как увеличить приоритет отправки (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;
|