ID:               21197
 Comment by:       dinesh at dinsoft dot net
 Reported By:      bool at boolsite dot net
 Status:           Assigned
 Bug Type:         Sockets related
 Operating System: *
 PHP Version:      5.*, 4.* (2005-11-17) (cvs)
 Assigned To:      pollita
 New Comment:

Indeed, it works with :

        //m = fcntl(bsd_socket, F_GETFL);
        //if (m < 0) {
        //      return m;
        //}

        nonblock = 0;

So the fcntl() call makes it fail.

But this has the side effect of making the socket_read() call blocking
even if the socket has been set to non blocking mode.

I will try to make a fully working patch with no side effect when I'll
have some time, if no one else is wanting to solve this problem.

For the lambda users, here is a usuable dll built against PHP 5.2.3 :
 http://www.dinsoft.net/dev/php/php_sockets.dll

Regards,
 Dinesh Bolkensteyn


Previous Comments:
------------------------------------------------------------------------

[2007-06-23 13:33:06] dinesh at dinsoft dot net

Hi all,

The bug is still there in: PHP 5.2.3 (cli) (built: May 31 2007
09:37:22) (binary zip release)

The initial bug report was posted on 26 Dec 2002 9:32am UTC, almost 5
years ago.

PHP_NORMAL_READ works well under *NIX, but the same scripts does not
work on windows.

If the above patch is working, then it should be added in the binary
release.

Thanks.

------------------------------------------------------------------------

[2006-11-15 06:33:38] thessoro at gmail dot com

I think the existence of this bug should be mentioned in the
documentation to prevent developers rely on PHP_NORMAL_READ. Although OS
category is set to * i can only reproduce it in windows. I checked my
script there too late.
So, as a script relying this feature is capable of making the entire
socket extension useless on Windows, i think is important enough to
mention it en the socket_read section of the manual. 

Thx,

------------------------------------------------------------------------

[2005-11-05 22:10:22] [EMAIL PROTECTED]

I've made a patch that implements the idea of my last comment. The test
case now works properly.
I haven't tested bug #35062 but it seems to be a different bug.
http://mega.ist.utl.pt/~ncpl/php_sockets_win.txt

------------------------------------------------------------------------

[2005-11-05 01:36:39] [EMAIL PROTECTED]

I was walking through the MSDN docs and I didn't also find anything.
But the best way (IMHO) is to store in the php_socket struct if the
socket is blocking or not (and update that field in the
socket_set_(non)block() functions). It also saves the fcntl syscall on
nix systems.

------------------------------------------------------------------------

[2005-11-04 19:30:44] [EMAIL PROTECTED]

Here's a possible patch, but Wez probably knows better if there's a way
to tell if a windows socket is in blocking mode...

Index: sockets.c
===================================================================
RCS file: /repository/php-src/ext/sockets/sockets.c,v
retrieving revision 1.171.2.2
diff -u -p -d -r1.171.2.2 sockets.c
--- sockets.c   3 Nov 2005 15:00:51 -0000       1.171.2.2
+++ sockets.c   4 Nov 2005 18:28:45 -0000
@@ -257,6 +257,12 @@ static int php_read(int bsd_socket, void
        int nonblock = 0;
        char *t = (char *) buf;

+/*
+ * fcntl(s, F_GETFL) will always fail for windows, and there's no way
to
+ * determine if a socket is in blocking mode to my current knowledge,
so we
+ * just omit this check; though that means we're always blocking on
win32...
+ */
+#ifndef PHP_WIN32
        m = fcntl(bsd_socket, F_GETFL);
        if (m < 0) {
                return m;
@@ -264,6 +270,7 @@ static int php_read(int bsd_socket, void

        nonblock = (m & O_NONBLOCK);
        m = 0;
+#endif

        set_errno(0);



------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/21197

-- 
Edit this bug report at http://bugs.php.net/?id=21197&edit=1

Reply via email to