I just came across a bug still present in the latest php 4 release. i have
the following script:

  $g_ssock=fsockopen($server,$port,$errno,$errstr,30);
  socket_set_blocking($g_ssock,0);
  while(!feof($g_ssock))
    echo fgets($g_ssock,4096);

if you uncomment the socket_set_blocking line it will work fine on win32,
but with non blocking sockets,  feof will always return true. by digging
through the code, it appears that fsock.c uses the errno() function for
determining any socket error as seen in function php_sockread_internal:

        } else if(nr_bytes == 0 || (nr_bytes < 0 && errno != EWOULDBLOCK)) {
                sock->eof = 1;
        }

the problem is that win32 doesn't report socket errors with _errno() but
with WSAGetLastError() so here is my fix:

in fsock.c, line 46, replace:

#ifdef PHP_WIN32
#include <winsock.h>
#else

with:

#ifdef PHP_WIN32
#include <winsock.h>
#undef errno
#define errno (WSAGetLastError())
#else

and now it works like a charm :) please submit my patch to the cvs server so
i can benefit of it in the next php releases

bye,
-christophe

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to