2013-11-08 2 views
2

Я написал одно приложение в php, которое использует сокеты. Внезапно возникла необходимость запускать его на окнах, перед этим это было только на Linux без проблем.Какая разница с сокетом в окнах с использованием php?

В настоящее время проблема находится в socket_recv функция, которая используется как $bytes = @socket_recv($socket, $data, 2048, MSG_DONTWAIT);. Прежде всего, на окнах нет никакого MSG_DONTWAIT констант, так как я об этом узнал. Я нашел небольшое исправление для него нравится:

if (!defined('MSG_DONTWAIT')) 
    define('MSG_DONTWAIT', 0x40); 

Тогда он говорит:

Warning: socket_recv(): unable to read from socket [0]: The operation completed 
successfully. 

После того, как я решил спросить, может быть есть какая-то разница с работы с сокетами на Windows, и Linux?

ответ

0

Я считаю, что существует разница при создании сокета в Windows, а не в Linux.

Попробуйте что-то вроде этого:

<?php 

// Init 
error_reporting(E_ALL); 
set_time_limit(0); 
ob_implicit_flush(); 
$address = '127.0.0.1'; 
$port = 10000; 

// On Windows we need to use AF_INET 
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX); 

// Create socket 
if (($sock = socket_create($domain, SOCK_STREAM, SOL_TCP)) === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
} 

// Bind socket to port 
if (socket_bind($sock, $address, $port) === false) { 
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

// start listening 
if (socket_listen($sock, 5) === false) { 
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 
do { 
    if (($msgsock = socket_accept($sock)) === false) { 
     echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
     break; 
    } 
    /* Send instructions. */ 
    $msg = "\nWelcome to the PHP Test Server. \n" . 
     "To quit, type 'quit'. To shut down the server type 'shutdown'.\n"; 
    socket_write($msgsock, $msg, strlen($msg)); 

    do { 
     if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
      echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
      break 2; 
     } 
     if (!$buf = trim($buf)) { 
      continue; 
     } 
     if ($buf == 'quit') { 
      break; 
     } 
     if ($buf == 'shutdown') { 
      socket_close($msgsock); 
      break 2; 
     } 
     $talkback = "PHP: You said '$buf'.\n"; 
     socket_write($msgsock, $talkback, strlen($talkback)); 
     echo "$buf\n"; 
    } while (true); 
    socket_close($msgsock); 
} while (true); 

socket_close($sock); 

?> 
+1

по умолчанию я использовать AF_INET – Kin

+0

же здесь, я также использовать AF_INET по умолчанию на сервере WAMP с PHP 5.4 –

 Смежные вопросы

  • Нет связанных вопросов^_^