Could not bind socket address and port are already in use как исправить

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 Schenkel's user avatar

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 Schenkel's user avatar

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

Marco van de Voort's user avatar

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

PRTG Network Monitor

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Такая возникла проблема.
по умолчанию порт у сервера 10001, а у клиента 10000.
Пыталась сделать, чтобы если порт у сервера занят уже, то поменять значения портов наоборот.
но проблема в том, что если это сделать, все равно вылетает ошибка Could not bind socket. Address and port are already in use. Причем если при обработке указать два совсем других порта (которые не заняты) все равно после обработки исключительной ситуации возникает эта же ошибка.

Delphi
1
2
3
4
5
6
7
8
9
10
11
try
      IdUDPClient1.Active:= true;
      IdUDPServer1.Active:= true; //как сделать, чтобы ошибка не показывалась тут, если порт занят
      except
      IdUDPClient1.Active:= false;
      IdUDPServer1.Active:= false;
      IdUDPServer1.DefaultPort:=10000;
      IdUDPClient1.Port:=10001;
      IdUDPClient1.Active:= true;
      IdUDPServer1.Active:= true;//и вот тут
      end;

и вообще, может ли вызывать эту ошибку то, что к порту уже подключен клиент?



0



2649 / 2270 / 279

Регистрация: 24.12.2010

Сообщений: 13,725

27.09.2012, 12:18

2

Зачем вообще в одном и том же приложении понадобился и сервер и клиент ?
В случае udp вполне достатно одного – либо сервера либо клиента.



0



219 / 125 / 99

Регистрация: 14.03.2011

Сообщений: 628

27.09.2012, 13:20

 [ТС]

3

mss, для передачи звука.
насколько мне известно (может быть плохо известно) клиент принимать не может. А мне надо в двух направлениях. что-то типа голосового чата.
Один пользователь выбирает из базы, которая хранит все IP адреса, адресата и звонит ему. Тот в совю очередь может ответить, сбросить, либо быть занят.
В одном направлении не проблем нету сделать, а для двух сделала так.
просто по другому как сделать ума не приложу. Со всем этим впервые имею дело.



0



210 / 169 / 24

Регистрация: 24.04.2012

Сообщений: 615

27.09.2012, 13:49

4

Цитата
Сообщение от Chertenok_n_13
Посмотреть сообщение

Пыталась сделать, чтобы если порт у сервера занят уже, то поменять значения портов наоборот.

И кем же он уже занят? И смысл менять, тогда клиент не сможет занять этот порт и опять исключение.

Цитата
Сообщение от Chertenok_n_13
Посмотреть сообщение

и вообще, может ли вызывать эту ошибку то, что к порту уже подключен клиент?

По UDP никто никуда не подключается. Пакет шлется на адрес и порт, а открыт на том адресе тот порт или нет и дошел ли вообще пакет никого не волнует.



0



2649 / 2270 / 279

Регистрация: 24.12.2010

Сообщений: 13,725

27.09.2012, 13:57

5

Цитата
Сообщение от Chertenok_n_13
Посмотреть сообщение

клиент принимать не может

Может. И в TCP и в UDP.
Принципиальная разница лишь в том что в TCP инициатором подключения может являться только клиент, но не сервер.
А в UDP понятие “подключение” отсутствует в принципе.



0



219 / 125 / 99

Регистрация: 14.03.2011

Сообщений: 628

27.09.2012, 19:35

 [ТС]

6

Цитата
Сообщение от Nutserus
Посмотреть сообщение

По UDP никто никуда не подключается. Пакет шлется на адрес и порт, а открыт на том адресе тот порт или нет и дошел ли вообще пакет никого не волнует.

а откуда тогда ошибка Could not bind socket. Address and port are already in use??

Добавлено через 52 секунды

Цитата
Сообщение от mss
Посмотреть сообщение

Может. И в TCP и в UDP.
Принципиальная разница лишь в том что в TCP инициатором подключения может являться только клиент, но не сервер.
А в UDP понятие “подключение” отсутствует в принципе.

просто тогда придется разграничивать,что на одном запускается клиент, а на другом сервер. это удобно если два компьютера. а если больше?



0



2649 / 2270 / 279

Регистрация: 24.12.2010

Сообщений: 13,725

27.09.2012, 20:36

7

Цитата
Сообщение от Chertenok_n_13
Посмотреть сообщение

придется разграничивать,что на одном запускается клиент, а на другом сервер. это удобно если два компьютера. а если больше?

Это я, наверно, со стенкой говорил. С дубовой.



0



219 / 125 / 99

Регистрация: 14.03.2011

Сообщений: 628

27.09.2012, 20:45

 [ТС]

8

Цитата
Сообщение от mss
Посмотреть сообщение

Это я, наверно, со стенкой говорил. С дубовой.

хорошо, что Вы в этом прекрасно разбираетесь. люди мне кажется тут за помощью обращаются.
место того, чтобы вот такие реплики высказывать, можно просто помочь или что-нибудь посоветовать, если видите, что человек не может разобраться.



1



2649 / 2270 / 279

Регистрация: 24.12.2010

Сообщений: 13,725

27.09.2012, 21:03

9

Цитата
Сообщение от Chertenok_n_13
Посмотреть сообщение

что-нибудь посоветовать

Я УЖЕ посоветовал – выкинь из воего приложения либо 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, ага.
порты должны же быть одинаковые? так?
просто тут самая проблемка, что если порты одинаковые, то вылазит ошибка и компонент не становится активным.
или я чего-то не понимаю…
если пытаюсь отправлять сервером и принимать сервером, то вылазит ошибка “Socket Error #10054 Connection reset by peer”

Добавлено через 34 минуты
и плюс, даже если отправлять простое сообщение, а не буффер, то OnRead все равно не реагирует…



0



210 / 169 / 24

Регистрация: 24.04.2012

Сообщений: 615

28.09.2012, 11:53

13

Цитата
Сообщение от Chertenok_n_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, есть методы приема и есть методы передачи данных.
В соответствии с протоколом инф.обмена в каждый момент времени один из партнеров по обмену передает данные (вызывает методы передачи), другой ожидает и принимает эти данные (вызывает методы приема). Вот и всё. И никаких коннектов, серверов, клиентов.
Т.е. обе стороны обмена инициируют свои компоненты, занимая каждый свой порт, естественно свободный и заранее известный партнеру.
Передающая сторона указывает адрес-порт принимающей и передает ей сообщение. Получив сообщение другая сторона может зная адрес и порт партнера может

точно таким же

образом ответить.
Вопросы прохождения NAT и файрволов здесь для простоты не рассматриваем – это отдельная песня, во много раз сложнееп твоей примитивной задачи.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

28.09.2012, 19:02

Помогаю со студенческими работами здесь

Обработка ошибки
Здравствуйте,подскажите,пожалуйста,как обработать ошибку:при вводе заданной точности я ввожу…

Обработка ошибки
Я получаю таги таким образом:
TAG_ID3 *id3=(TAG_ID3*)BASS_ChannelGetTags(chan, BASS_TAG_ID3); //…

Обработка ошибки
добавляю данные в таблицу:
Form1-&gt;ADOTable1-&gt;Insert();
Form5-&gt;ADOTable1-&gt;Insert();…

Обработка ошибки
Почему в любом случае есть лист или нет с таким названием все равно срабатывает
If MsgBox(&quot;Лист…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

15

Добавить комментарий