ID: 19421 Comment by: cosas at minovela dot com Reported By: taco at osisoft dot nl Status: Bogus Bug Type: Class/Object related Operating System: Red Hat 7.1 PHP Version: 4.2.2 New Comment:
newer versions of php has a lot of problems with sockets... Previous Comments: ------------------------------------------------------------------------ [2002-09-19 15:40:32] taco at osisoft dot nl I deliberatly commented that line. The code should fetch the welcome messages, but when I uncomment it, the stalling will occure! I know the POP3 protocol, that's not the issue here ;-). Issue is that the fgets stalls when using it in a class structure or/and using class variables. I've got it all working now, but without using a class. After I stripped of the TPOP3Mail class it worked immediatly. ------------------------------------------------------------------------ [2002-09-19 04:54:21] [EMAIL PROTECTED] Try uncommenting the "Catching the servers welcome messages" line of code... This is not a support forum; you should really read the POP3 protocol spec. ------------------------------------------------------------------------ [2002-09-19 01:37:50] taco at osisoft dot nl I can run this example (using my own pop3 account). Unfortunatly you will see something like this: >> USER xxxx << +OK Welcome to this POP3 server >> PASS xxxx << +OK User is welcome You have .... message(s) As you see the returning messages is always one message behind. With the commented line I wanted to get the welcome message after connection, before authentication. If I therefor uncomment that line, it will stall. I have tried several things, like using a local variable instead of a class variable. That works better, as the title shows, but it still works buggy. often it's alright, but sometimes it keeps stalling. Currently I use this functionality without a class and than it works fine. <? class TPOP3Mail { var $server; var $port; var $user; var $password; var $socket; var $error; function TPOP3Mail($server, $port, $user, $pwd) { $this->server = $server; $this->port = $port; $this->user = $user; $this->password = $pwd; } function Connect() { $this->socket = fsockopen($this->server, $this->port, $errno, $errstr, 3); if($this->socket <= 0) { $this->error = "Could not connect to $this->server on port $this->port. Connection Error $errno. Reason: $errstr"; return 0; } $this->error = ""; // fgets($this->socket, 1024); //Catching server's welcome messages print ">>: USER $this->user<BR>\n"; fwrite($this->socket, "USER $this->user\r\n"); $result = fgets($this->socket, 1024); print "<<: $result<BR>\n"; if (substr($result, 0, 3) == "+OK") { print ">>: PASS xxxx<BR>\n"; fwrite ($this->socket, "PASS $this->password\r\n"); $result = fgets($this->socket, 1024); print "<<: $result<BR>\n"; if (substr($result, 0, 3) != "+OK") $this->error = "Error while logging on ($result)"; } else $this->error = "Error while logging on ($result)"; if ($this->error != "") return 0; return $this->socket; } function ShowMail($nr) { fwrite ($this->socket, "RETR $nr\r\n"); $response = fgets ($this->socket, 1024); $i = 4; $s = ""; //stores byte size of the message while ($response[$i] != " ") $s .= $response[$i++]; $response = fread($this->socket, $s); fgets ($this->socket, 1024); return $response; } function MailCount() { fwrite ($this->socket, "STAT\r\n"); $response = fgets ($this->socket, 1024); $i = 4; $s = ""; while ($response[$i] != " ") $s .= $response[$i++]; return $s; } } //Please use an pop3 account in the following line. $webmail = new TPOP3Mail("server", "110", "user", "pwd"); if (!$webmail->Connect()) print $webmail->error; print "You have " . $webmail->MailCount() . " message(s).<BR><BR>\n"; print nl2br($webmail->ShowMail(1)); ?> ------------------------------------------------------------------------ [2002-09-18 19:21:58] [EMAIL PROTECTED] Please provide a short but complete example script which shows what you're trying to do. ------------------------------------------------------------------------ [2002-09-15 16:35:22] taco at osisoft dot nl I made a class which connects to the POP3 server at localhost. I used fsockopen to connect to the server. When I use a local variable ("$socket") then it works allright. When I store the resource in a class variable ($this->socket) the script will stall on fget*. Work around for me: I want to use the socket resource in other member functions. After the connection is initialized a class variable references to the local variable ($this->socket =& $socket). In the member function I first must make a local variable and refer it to the class variable ($socket =& $this->socket). I can't use $this->socket directly. So in short: I can't use a class variable with fwrite and fgets, but instead I must use local variables. (Hope may description was clear.) Greetings from Holland Taco Jan Osinga ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=19421&edit=1