php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #38043 Always tries to connect to client on same outgoing port
Submitted: 2006-07-09 03:47 UTC Modified: 2006-07-09 07:56 UTC
From: aeolianmeson at blitzeclipse dot com Assigned:
Status: Not a bug Package: Sockets related
PHP Version: 5.1.4 OS: Fedora 4
Private report: No CVE-ID: None
 [2006-07-09 03:47 UTC] aeolianmeson at blitzeclipse dot com
Description:
------------
I am connecting to myself and then closing, to sniff out available ports on my system that I can use-- I'm sure you're acquainted with this method.

It should always produce a different port (nPort), since no connection is erected (because it's UDP), but it always returns that it is on the SAME port.


Dustin Oprea

Reproduce code:
---------------
$n = 10;
while($n--)
{
	$strIP = $nPort = -1;

	$Socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
	socket_connect($Socket, '172.0.0.1', 8400);
	socket_getsockname($Socket, $strAddr, $nPort);
	socket_close($Socket);

	print("> Available port: $strAddr:$nPort\n");
}

Expected result:
----------------
It produces ten lines of output, that should each contain one unique, available port number. 

Actual result:
--------------
Each line indicates the same port, even if a socket has been opened for listening on it.


The problem I am having, therefore, is that I sniff the next available port from this code, and set up a listener on it. I then do the same thing again in order to open another listener on a different port, but it always returns to me the same port number, and I can not not bind it, obviously.

Is this intended?

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-07-09 07:48 UTC] tony2001@php.net
And it is PHP problem because .?. ?
This is what getsockname() returns, socket_getsockname() is just a wrapper.
 [2006-07-09 07:56 UTC] aeolianmeson at blitzeclipse dot com
There have been problems in the past in the translation of system calls through PHP... I wasn't sure if that was the intended effect.


I've found that I can circumvent this inherent flaw, by opening up another socket before the first is closed. This will render a different port.

Is this then, the only way to find an available port with PHP?

Dustin
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 16 11:01:29 2024 UTC