I have developed a Delphi web server application (TWebModule). It runs as a ISAPI DLL on Apache under Windows. The application in turn makes frequent https calls to other web sites using the Indy TIdHTTP component. Periodically I get this error when using the TIdHTTP.get method:
Could not bind socket. Address and port are already in use
Here is the code:
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdHTTP := TIdHTTP.create(nil);
idhttp.handleredirects := True;
idhttp.OnRedirect := DoRedirect;
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvSSLv3;
SSLOptions.Mode := sslmUnassigned;
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ProxyParams.BasicAuthentication := False;
Request.UserAgent := 'Test Google Analytics Interface';
Request.ContentType := 'text/html';
request.connection := 'keep-alive';
Request.Accept := 'text/html, */*';
end;
try
idhttp.get('http://www.mysite.com......');
except
.......
end;
IdHTTP.free;
IdSSLIOHandlerSocket1.free;
I have read about the reusesocket method, which can be set on both the TIdHttp and TIdSSLLIOHandlerSocketOpenSSL objects. Will setting this to rsTrue solve my problems? I ask because I have not been able to replicate this error, it just happens periodically.
Other considerations:
- I know multiple instances of TWebModule are being spawned.
- Would wrapping all calls to TIdHttp.get within a TCriticalSection solve the problem?
UPDATE:
After doing more searching on the internet I came across this:
link text
When I do a netstat -n I too get a bunch of entries with status “CLOSE_WAIT”.
asked May 17, 2010 at 12:39
M SchenkelM Schenkel
6,28412 gold badges62 silver badges106 bronze badges
I actually finally figured this out. Turns out I was NOT freeing the TIDHttp object. In my prototype example it shows it is. But my actual source code uses objects and the code where the idhttp object is freed is contained in a destructor not properly marked with override. So it was never called.
answered Jun 3, 2010 at 1:35
M SchenkelM Schenkel
6,28412 gold badges62 silver badges106 bronze badges
Try to allocate a high port number. Hooking low (0..1023) ports requires admin rights IIRC.
Forget it, my bad. tidhttp is the client, not the server.
Yes, it sounds like multiple threads try to use the same tidhttp.
A cricial section would work, but effectively serialize the result. If that is a problem, use a pool of tidhttp clients.
answered May 17, 2010 at 13:57
4
What is this?
This knowledgebase contains questions and answers about PRTG Network
Monitor and network monitoring in general. You are invited to get involved by asking and
answering questions!
Learn more
Intuitive to Use. Easy to manage.
More than 500,000 users rely on Paessler PRTG every day. Find out how you can
reduce cost, increase QoS and ease planning, as well.
Free Download
After upgrading to the latest version I am getting this error on three sensors. One is an Amazon CloudWatch sensor, one is an HTTP sensor and the other is an FTP sensor. All are on the same server. Restarting the probe sometimes will bring one of them back, but then the others throw the error. The sensors were fine before the upgrade.
cloudwatch
ftp
sockets
Best Answer
Accepted Answer
If this message is shown by PRTG sensors, this means that the PRTG Probe is not able to open any outgoing TCP ports for outgoing monitoring requests.
There are two possible reasons for the message “Could not bind socket. Address and port are already in use”:
- In the probe settings you have selected an outgoing IP (and with that a network interface) that can not reach the desired target system. The IP stack on the probe system tries to open an outgoing port but the selected network interface can’t provide it.
- Sometimes overloading situations (which can be caused by PRTG, or other programs, or other problems) can cause the IP stack of the probe system to run out of outgoing port numbers. This can sometimes be cured by rebooting the probe system.
Disclaimer: The information in the Paessler Knowledge Base comes without warranty of any kind. Use at your own risk. Before applying any instructions please exercise proper system administrator housekeeping. You must make sure that a proper backup of all your data is available.
unit Server;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdContext, IdBaseComponent, IdComponent, IdCustomTCPServer,
IdTCPServer, IdCmdTCPServer, IdExplicitTLSClientServerBase, IdFTPServer,
IdIntercept, IdServerInterceptLogBase, IdServerInterceptLogFile, ShlObj;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Edit3: TEdit;
edit2: TEdit;
edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
IdFTPServer1: TIdFTPServer;
logfile1: TIdServerInterceptLogFile;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IdFTPServer1ChangeDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
procedure IdFTPServer1DeleteFile(ASender: TIdFTPServerContext;
const APathName: string);
procedure IdFTPServer1FileExistCheck(ASender: TIdFTPServerContext;
const APathName: string; var VExist: Boolean);
procedure IdFTPServer1GetFileDate(ASender: TIdFTPServerContext;
const AFilename: string; var VFileDate: TDateTime);
procedure IdFTPServer1GetFileSize(ASender: TIdFTPServerContext;
const AFilename: string; var VFileSize: Int64);
procedure IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
procedure IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
const AFileName: string; var VStream: TStream);
procedure IdFTPServer1RenameFile(ASender: TIdFTPServerContext;
const ARenameFromFile, ARenameToFile: string);
procedure IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
procedure IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
const AUsername, APassword: string; var AAuthenticated: Boolean);
procedure IdFTPServer1StoreFile(ASender: TIdFTPServerContext;
const AFileName: string; AAppend: Boolean; var VStream: TStream);
procedure IdFTPServer1AfterUserLogin(ASender: TIdFTPServerContext);
procedure IdFTPServer1Exception(AContext: TIdContext;
AException: Exception);
procedure IdFTPServer1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
procedure IdFTPServer1Stat(ASender: TIdFTPServerContext;
AStatusInfo: TStrings);
procedure IdFTPServer1Execute(AContext: TIdContext);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
homedir: string;
implementation
{$R *.dfm}
function setSlashes(APath:String):String;
var
slash:string;
begin
slash := StringReplace(APath, ‘/’, ”, [rfReplaceAll]);
slash := StringReplace(slash, ”, ”, [rfReplaceAll]);
Result := slash;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
idftpserver1.DefaultPort:=strtoint(edit3.text);
idftpserver1.Active:=true;
showmessage(‘Подключено’);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
idftpserver1.Active:=false;
close;
end;
procedure TForm1.IdFTPServer1AfterUserLogin(ASender: TIdFTPServerContext);
begin
//Установить домашний каталог
homedir:=’c:’;
end;
procedure TForm1.IdFTPServer1ChangeDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
begin
ASender.CurrentDir:= VDirectory;
end;
procedure TForm1.IdFTPServer1DeleteFile(ASender: TIdFTPServerContext;
const APathName: string);
begin
if fileexists(APathName) then
begin
DeleteFile(APathName);
end;
end;
procedure TForm1.IdFTPServer1Exception(AContext: TIdContext;
AException: Exception);
begin
showmessage(AException.Message);
end;
procedure TForm1.IdFTPServer1Execute(AContext: TIdContext);
begin
logfile1.DoLogWriteString(AContext.Connection.IOHandler.AllData);
end;
procedure TForm1.IdFTPServer1FileExistCheck(ASender: TIdFTPServerContext;
const APathName: string; var VExist: Boolean);
begin
if fileexists(APathName) then
begin
VExist:=true;
end
else
begin
VExist:=False;
end;
end;
procedure TForm1.IdFTPServer1GetFileDate(ASender: TIdFTPServerContext;
const AFilename: string; var VFileDate: TDateTime);
var
fdate:tdatetime;
begin
//Поставить дату файла в переменную
fdate:= FileAge(AFilename);
if not (fdate=-1) then begin
VFileDate:=fdate;
end;
end;
procedure TForm1.IdFTPServer1GetFileSize(ASender: TIdFTPServerContext;
const AFilename: string; var VFileSize: Int64);
Var
LFile : String;
rec:tsearchrec;
ASize: Int64 ;
begin
LFile := setslashes(homedir + AFilename );
try
if FindFirst(Lfile, faAnyFile, rec) = 0 then repeat
Asize:=rec.Size;
until FindNext(rec) <> 0;
finally
FindClose(rec);
end;
if Asize > 1 then
VFileSize:= Asize
else
VFilesize:=0;
end;
procedure TForm1.IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
var
ldir:string;
begin
ldir:= setslashes(homedir + VDirectory);
if not DirectoryExists(ldir) then
if not CreateDir(ldir) then
raise Exception.Create(‘Невозможно создать ‘+ldir);
end;
procedure TForm1.IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext;
var VDirectory: string);
Var
LFile : String;
begin
LFile := setslashes(homedir + VDirectory);
if directoryexists(LFile) then begin
RemoveDir(LFile);
end
else
begin
Raise Exception.Create(‘Не удается удалить каталог’);
end;
end;
procedure TForm1.IdFTPServer1RenameFile(ASender: TIdFTPServerContext;
const ARenameFromFile, ARenameToFile: string);
begin
if not Renamefile(ARenameFromFile,ARenameToFile) then
begin
Raise Exception.Create(‘Не удается переименовать файл ‘);
end;
end;
procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
const AFileName: string; var VStream: TStream);
begin
VStream := TFileStream.Create(setSlashes
(homedir+AFilename),fmOpenRead);
end;
procedure TForm1.IdFTPServer1Stat(ASender: TIdFTPServerContext;
AStatusInfo: TStrings);
var
i:integer;
begin
for i:= 0 to astatusinfo.Count-1 do
begin
memo1.Lines.Add(astatusinfo.Strings[i]);
end;
end;
procedure TForm1.IdFTPServer1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
memo1.lines.add(Astatustext);
end;
procedure TForm1.IdFTPServer1StoreFile(ASender: TIdFTPServerContext;
const AFileName: string; AAppend: Boolean; var VStream: TStream);
begin
if not Aappend then
VStream := TFileStream.Create(AFileName,fmCreate)
else
VStream := TFileStream.Create(AFileName,fmOpenWrite)
end;
procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
const AUsername, APassword: string; var AAuthenticated: Boolean);
begin
if (AUsername = edit1.Text) and (APassword = edit2.Text) then
begin
AAuthenticated:=True
end
else
begin
AAuthenticated := False;
end;
end;
end.
Updated March 11, 2022 12:39
This error is caused by the add-on.
For example, if you launch two clients on the same machine (probably if you are using Password Depot on a terminal server) and receive this error, you must assign to users different port numbers in order to correctly communicate with the browser add-on:
To do so, open the program options by going to Edit -> Options -> Browsers and change the value of the WebSockets port. The same value must then also be set in the browser add-on (within the browser itself).
For more information, please click here.
If you use a terminal server, we also recommend taking into consideration the following:
Using Password Depot on a Terminal Server
Chertenok_n_13 219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
||||
1 |
||||
Обработка ошибки27.09.2012, 11:57. Показов 4360. Ответов 14 Метки нет (Все метки)
Такая возникла проблема.
и вообще, может ли вызывать эту ошибку то, что к порту уже подключен клиент?
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,725 |
|
27.09.2012, 12:18 |
2 |
Зачем вообще в одном и том же приложении понадобился и сервер и клиент ?
0 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
27.09.2012, 13:20 [ТС] |
3 |
mss, для передачи звука.
0 |
210 / 169 / 24 Регистрация: 24.04.2012 Сообщений: 615 |
|
27.09.2012, 13:49 |
4 |
Пыталась сделать, чтобы если порт у сервера занят уже, то поменять значения портов наоборот. И кем же он уже занят? И смысл менять, тогда клиент не сможет занять этот порт и опять исключение.
и вообще, может ли вызывать эту ошибку то, что к порту уже подключен клиент? По UDP никто никуда не подключается. Пакет шлется на адрес и порт, а открыт на том адресе тот порт или нет и дошел ли вообще пакет никого не волнует.
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,725 |
|
27.09.2012, 13:57 |
5 |
клиент принимать не может Может. И в TCP и в UDP.
0 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
27.09.2012, 19:35 [ТС] |
6 |
По UDP никто никуда не подключается. Пакет шлется на адрес и порт, а открыт на том адресе тот порт или нет и дошел ли вообще пакет никого не волнует. а откуда тогда ошибка Could not bind socket. Address and port are already in use?? Добавлено через 52 секунды
Может. И в TCP и в UDP. просто тогда придется разграничивать,что на одном запускается клиент, а на другом сервер. это удобно если два компьютера. а если больше?
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,725 |
|
27.09.2012, 20:36 |
7 |
придется разграничивать,что на одном запускается клиент, а на другом сервер. это удобно если два компьютера. а если больше? Это я, наверно, со стенкой говорил. С дубовой.
0 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
27.09.2012, 20:45 [ТС] |
8 |
Это я, наверно, со стенкой говорил. С дубовой. хорошо, что Вы в этом прекрасно разбираетесь. люди мне кажется тут за помощью обращаются.
1 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,725 |
|
27.09.2012, 21:03 |
9 |
что-нибудь посоветовать Я УЖЕ посоветовал – выкинь из воего приложения либо IdUDPClient либо IdUDPServer.
0 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
27.09.2012, 22:42 [ТС] |
10 |
mss, ты сказал, что вполне хватит. после этого я сказала для чего мне это надо и больше ты ничего вразумительного по этому поводу не сказал.
0 |
210 / 169 / 24 Регистрация: 24.04.2012 Сообщений: 615 |
|
28.09.2012, 00:33 |
11 |
Кладешь на форму IdUDPServer1, чтобы послать пакет вызываешь IdUDPServer1.Send(); , принимаешь процедурой IdUDPServer1UDPRead.
1 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
28.09.2012, 11:00 [ТС] |
12 |
Nutserus, ага. Добавлено через 34 минуты
0 |
210 / 169 / 24 Регистрация: 24.04.2012 Сообщений: 615 |
|
28.09.2012, 11:53 |
13 |
порты должны же быть одинаковые? так? Одинаковые с чем? У тебя один компонент и один порт. Я конечно понимаю, читать сдк скучно и неинтересно, сразу хочется руками потрогать, тогда почему бы не скачать готовый исходник и пилить его под себя? Идея неновая и реализаций ее множество.
0 |
219 / 125 / 99 Регистрация: 14.03.2011 Сообщений: 628 |
|
28.09.2012, 12:12 [ТС] |
14 |
искала исходники. в одном направлении клиент-сервер есть и много, а сервер-сервер например ни разу не встретила тоже самое как клиент-клиент.
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,725 |
|
28.09.2012, 19:02 |
15 |
У udp-компонента, в твоем случае например TIdUDPClient, есть методы приема и есть методы передачи данных. точно таким же образом ответить.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
28.09.2012, 19:02 |
Помогаю со студенческими работами здесь Обработка ошибки Обработка ошибки Обработка ошибки Обработка ошибки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 15 |