multiple sockets seems problematic
| From: | Bob Dusek | Date: | Thu, 22 Feb 2007 14:38:39 +0000 |
| Subject: | multiple sockets seems problematic | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-249237@lists.php.net to get a copy of this message | ||
Hello all,
I've got a program (program X) that does the following:
* opens a socket (socket A)
* binds socket A to an address/port (x.x.x.x/1099)
* then opens another socket (socket B),
* binds socket B to an address/port (x.x.x.x/1100)
* calls listen on socket B
* launches a second program (program Y) with proc_open
* accepts a connection on socket B (presumably from program Y)
* sends a packet on socket B
* reads a packet from socket B
* listens on socket A <========== PROBLEM
* accepts a connection on socket A (from whomever is trying to connect)
To be clear, the socket B stuff was just added. socket A has always
existed and worked just fine. Each socket resource is stored in a
distinct variable.
Where things go wrong, now that I've added socket B, is when I call
socket_accept() on socket A...
For some reason, the socket_accept($sock) call will not block, even
after I've added an explicit socket_set_block($sock) call immediately
preceding the socket_accept($sock) call.
I don't think there are actually any connections waiting when I call
socket_accept($sock), as the socket_accept call returns false.
Although, the socket_strerror(socket_last_error($sock)) returns
"Success". This seems like the behavior I would expect if my socket was
set to non-blocking.
Here are the options, from socket_get_options, for socket A before I
call accept:
Resource id #17 [DEBUG] 0
Resource id #17 [ACCEPTCON]
Resource id #17 [BROADCAST] 0
Resource id #17 [REUSEADDR] 0
Resource id #17 [KEEPALIVE] 0
Resource id #17 [LINGER] l_onoff = 0
Resource id #17 [LINGER] l_linger = 0
Resource id #17 [OOBINLINE] 0
Resource id #17 [SNDBUF] 16384
Resource id #17 [RCVBUF] 87380
Resource id #17 [ERROR] 0
Resource id #17 [TYPE] 1
Resource id #17 [DONTROUTE] 0
Resource id #17 [RCVLOWAT] 1
Resource id #17 [RCVTIMEO] sec = 0
Resource id #17 [RCVTIMEO] usec = 0
Resource id #17 [SNDLOWAT] 1
Resource id #17 [SNDTIMEO] sec = 0
Resource id #17 [SNDTIMEO] usec = 0
It seems to me that the actions I'm taking on socket B are somehow
dirying socket A.
Anyone know of any problems reported with this? I'm using PHP 4.3.11.
But, I don't see anything in the changelogs that would indicate
something like this has been fixed since 4.3.11.
Also, when my socket_accept call fails for socket A, I try to close the
socket and re-open it, but (even after calling socket_close) when I try
to bind to the same address/port as I did the first time around,
socket_bind fails and tells me "Address already in use"... (and I try it
repeatedly, sleeping 5 seconds between attempts, and it never becomes
available).
Any help or pointers would be appreciated.
Thanks,
Bob