[PHP] socket_bind() -> Could not bind to socket

Pagina: 1
Acties:
  • 188 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Ik heb een stukje code gemaakt om commando's te sturen naar mijn IIS server. Dat werkt allemaal perfect, alleen 1 probleempje. Als ik de regel socket_bind() ertussen plaats dan krijg ik een foutmelding.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   function execute($server, $command) {
      // Variables
      $source_ip = gethostbyname($server);
      $port = '5540';

      $success = true;

      // Create socket
      $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or $success = false;
      if ($success == false) { return array('code' => '804', 'message' => 'Could not create socket'); }

      // Bind socket to port
      $result = socket_bind($socket, $source_ip) or $success = false;
      if ($success == false) { return array('code' => '805', 'message' => 'Could not bind to socket'); }

      // Connect
      socket_connect($socket, $server, $port);

      $result = trim(@socket_read($socket, 4096));
      socket_write($socket, "$command\r\n");

      $result = "";
      $result = trim(@socket_read($socket, 4096));

      socket_write($socket, "exit\r\n");
      socket_close($socket);

      return $result;
   }


Zonder de socket_bind() (regel 13) werkt het vlekkeloos, maar als ik de regels er wel tussenzet krijg ik de volgende foutmelding:

Warning: socket_bind() [function.socket-bind]: unable to bind address [49]: Can't assign requested address in /var/www/test.php on line 16

Ik heb gelezen dat het veiliger is om die regel er wel tussen te plaatsen ipv gewoon weg te laten. Maar hoe krijg ik het dan werkend?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De oplossing is natuurlijk weten hoe te debuggen, en daar staat gewoon een prima hint over in de manual:
The error code can be retrieved with socket_last_error(). This code may be passed to socket_strerror() to get a textual explanation of the error.
O, en socket_bind geeft al een boolean terug, dus die hele ' or $success = false' constructie slaat echt als een tang op een varken. :>

{signature}


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Ik had die socket_last_error() en socket_strerror() zelf ook uitgeprobeerd. Maar dan krijg ik gewoon 49 en als string Can't assign requested address. Zover was ik zelf ook al.

Ik kan ook niet uitvogelen of het probleem ligt bij mijn code of dat het een serverside instelling is aan de andere kant?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Probeer eens te binden naar 0.0.0.0

[ Voor 1% gewijzigd door Patriot op 11-01-2008 11:58 . Reden: typfix ]


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Dat doet ie wel, maar heb ik nu hetzelfde effect dan? Of is dit een debug truukje?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Ik weet niet precies wat het is, maar zo heb ik het ooit geleerd en het werkt bij mij altijd. Ik denk dat ergens de 0.0.0.0 gewoon voor het goede IP wordt vervangen.

Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Weet je zeker dat wat je functie voert met $server ook een hostname is die hij kan herleiden? Wat krijg je als je $source_ip echo't?

[ Voor 29% gewijzigd door Crayne op 11-01-2008 12:11 ]

Mijn Library Thing catalogus


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Het probleem is dus dat je wil binden aan hetzelfde adres als waar je naar wil connecten. $source_ip (op regel 3) is een slechte naam, iets als $destination_ip of $server_ip is veel duidelijker. Als je example 1 uit de documentatie leest, zie je wellicht het onderscheid tussen source en destination.

{signature}


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Voutloos schreef op vrijdag 11 januari 2008 @ 12:17:
Het probleem is dus dat je wil binden aan hetzelfde adres als waar je naar wil connecten. $source_ip is een slechte naam, iets als $destination_ip of $server_ip is veel duidelijker. Als je example 1 uit de documentatie leest, zie je wellicht het onderscheid tussen source en destination.
"Source" is in deze zeker geen slechte naam, het is de bron van de uiteindelijke verbinding en dat is de server zelf inderdaad.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zie example 1 van http://nl3.php.net/manual/en/function.socket-bind.php . Source en destination staan in de comments precies andersom genoemd. Ambigue, dus slechte naam.

Vandaar dat ik ook $server_ip noem, wat imo de meest duidelijke naamgeving is.

{signature}


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Voutloos schreef op vrijdag 11 januari 2008 @ 12:27:
Zie example 1 van http://nl3.php.net/manual/en/function.socket-bind.php . Source en destination staan in de comments precies andersom genoemd. Ambigue, dus slechte naam.

Vandaar dat ik ook $server_ip noem, wat imo de meest duidelijke naamgeving is.
Ze worden daar helemaal niet anders genoemd, de socket_bind wordt gedaan op een element van de array $sourceips. Bij het binden staat bovendien de comment "// Bind the source address"

Verder zie ik het daar ook nergens anders staan, dan source/local ip bij de socket_bind en server/remote ip bij de socket_connect.

EDIT: Als je refereert naar de waarde die $source_ip heeft in het geval van de OP dan is dit inderdaad fout, maar de variabele die je uiteindelijk aan socket_bind() geeft $source_ip noemen is zeer logisch.

[ Voor 12% gewijzigd door Patriot op 11-01-2008 12:32 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ok, Ik raakte nu zelf in de war. Wat ik wou zeggen is dat het imo verwarrend is om de termen source/destination en client/server door elkaar te gebruiken. O-)

{signature}


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Crayne schreef op vrijdag 11 januari 2008 @ 12:11:
Weet je zeker dat wat je functie voert met $server ook een hostname is die hij kan herleiden? Wat krijg je als je $source_ip echo't?
Dat is allemaal geen probleem, dan krijg ik het goede IP.


Enne meedenken is nooit verkeerd ;) Maar $source_ip leek mij ook wel de meest geschikte naam.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
zoetericky schreef op vrijdag 11 januari 2008 @ 13:17:
[...]
Dat is allemaal geen probleem, dan krijg ik het goede IP.
Wees duidelijk, welk ip? Wat het moet dus _niet_ het adres van de server waarmee je wil connecten zijn, maar je eigen ip.

{signature}


Acties:
  • 0 Henk 'm!

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Ooow, kijk... dat antwoord zat ik op te wachten :). In mijn script is $source_ip hetzelfde ip als het ip als waarnaar ik de verbinding maak. Als ik daar gewoon $REMOTE_ADDR invul, dan werkt het wel foutloos :D 8)7

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online

{signature}


Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Patriot schreef op vrijdag 11 januari 2008 @ 12:10:
Ik weet niet precies wat het is, maar zo heb ik het ooit geleerd en het werkt bij mij altijd. Ik denk dat ergens de 0.0.0.0 gewoon voor het goede IP wordt vervangen.
Je kan beter de manual lezen dan denken. Als je bind aan 0.0.0.0 dan bind je aan alle (netwerk) interfaces op de computer (dus bijvoorbeeld lo, eth0 en eth1). Als je bind aan een ip-nummer dan bind je alleen aan de interface die dat nummer heeft. Dus bijvoorbeeld bind aan 127.0.0.1, dan bind je aan lo, bind je je aan 10.0.0.1 dan bind je je aan eth1.)

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Sendy schreef op vrijdag 11 januari 2008 @ 13:37:
[...]

Je kan beter de manual lezen dan denken. Als je bind aan 0.0.0.0 dan bind je aan alle (netwerk) interfaces op de computer (dus bijvoorbeeld lo, eth0 en eth1). Als je bind aan een ip-nummer dan bind je alleen aan de interface die dat nummer heeft. Dus bijvoorbeeld bind aan 127.0.0.1, dan bind je aan lo, bind je je aan 10.0.0.1 dan bind je je aan eth1.)
Punt is dat ik het niet in de manual zie staan, als het er had gestaan had ik het gelezen en dan had ik de reden ook precies geweten.

Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

zoetericky schreef op vrijdag 11 januari 2008 @ 13:30:
Ooow, kijk... dat antwoord zat ik op te wachten :). In mijn script is $source_ip hetzelfde ip als het ip als waarnaar ik de verbinding maak. Als ik daar gewoon $REMOTE_ADDR invul, dan werkt het wel foutloos :D 8)7
Mja, iets wat je dus had gezien als je wat standaard dingen had geprobeerd bij het debuggen.

Mijn Library Thing catalogus

Pagina: 1