php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #21366 socket_getpeername does not function with AF_UNIX sockets
Submitted: 2003-01-02 19:23 UTC Modified: 2003-04-18 12:47 UTC
From: piotr at t-p-l dot com Assigned:
Status: Closed Package: Documentation problem
PHP Version: 4.3.0 OS: Linux
Private report: No CVE-ID: None
 [2003-01-02 19:23 UTC] piotr at t-p-l dot com
sample code: (not complete .. just gives the idea)

///////////////

$Domain = // either AF_UNIX or AF_INET

$result = socket_accept($sock);
$address = "<undefined>";
$port = "<undefined>";
if ($Domain == AF_UNIX) {
  socket_getpeername($result,$address,$port);
  echo "Accepted Connection from: $address\n";
} else { // its AF_INET
  socket_getpeername($result,$address,$port);
  echo "Accepted Connection from: $address:$port\n";
}

///////////////

when the socket is a AF_INET socket the result if properly filled in. sample output:

Accepted Connection from: 123.123.123.123:1234

but when the socket is a unix socket .. the result is somehow wrong .. sample:

Accepted Connection from: $0

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-01-02 19:48 UTC] piotr at t-p-l dot com
just to remove the confusion .. that is a cleaned up sniped from a generic socket class I'm working on thats why the refernces to the socket's Domain (as oposed to being hardcoded)

the socket ($sock) was created with its domain set to the value of $Domain
 [2003-02-13 19:42 UTC] sniper@php.net
Could your please provide a short but _complete_, self-contained script? (yes, we're lazy :)

 [2003-02-13 20:15 UTC] piotr at t-p-l dot com
Here it goes .. 
<?php

$sock = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($sock, "/tmp/mysock");
socket_listen($sock);
$asock = socket_accept($sock);
socket_getpeername($asock, $address, $port);
echo "Connection from Address: $address Port: $port\n";

?>

the result (after connecting to the socket .. I used the utility "sock" to quickly connect to the socket) was the following:

Connection from Address: ??0
                             Port:

aka .. gibberish .. 
here is the result of php -v for your reference:
PHP 4.3.0 (cli) (built: Jan 13 2003 01:39:49)
Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
 [2003-03-04 20:39 UTC] sniper@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php4-STABLE-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php4-win32-STABLE-latest.zip

can't reproduce this..

 [2003-03-09 18:47 UTC] sniper@php.net
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.


 [2003-03-09 19:06 UTC] piotr at t-p-l dot com
I cant try those snapshots at the moment .. but rather than that .. I just have a simple question .. what do you get when you run that code and then connect to that socket? what is the expected result of the getpeername command when dealing with a unix socket?
 [2003-04-18 01:56 UTC] pollita@php.net
When creating server sockets there are two socket resources:

$serversocket = socket_create(....);

and

$connectionsocket = socket_accept($serversocket);

socket_getpeername($serversocket) will return the path of the server socket itself (/tmp/mysock in your case), but socket_getpeername($connectionsocket) doesn't have anything sensical to return since its 'peer' isn't a real socket location.

This is documented in the libc man pages, but it could certainly use a note in the PHP manual.  Reclassifying.

 [2003-04-18 12:47 UTC] pollita@php.net
Documented.
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Mon Jul 14 10:01:32 2025 UTC