2012-03-31 15 views
8

मैं PHP का उपयोग कर एक टीसीपी सर्वर बनाने पर हाल ही में काम कर रहा हूं (मुझे शुरू करने के लिए गलत विकल्प पता है लेकिन यह काम मानक है), इसलिए मैं उस बिंदु पर पहुंच गया हूं जहां पर परीक्षण करने के लिए एक विश्वसनीय प्रोटोटाइप है और यह दिखाया गया है अच्छा परिणाम। शुरुआत में मैंने सर्वर के लिए कनेक्शन को संभालने के लिए सॉकेट फ़ंक्शंस का उपयोग किया था और यह अच्छा काम कर रहा था लेकिन प्रोजेक्ट पर मुख्य चीजों में से एक चैनल को सुरक्षित करना है ताकि मैं stream_socket पर स्विच कर सकूं।जब भी पीएचपी में पीयर द्वारा कनेक्शन रीसेट किया जाता है, तो कैसे पता चलेगा?

जो मैं चाहता हूं वह socket_last_error stream_socket समूह में समतुल्य है, इसलिए जब भी क्लाइंट के साथ कनेक्शन बंद हो या नहीं, तो मुझे पता चलेगा। मौजूदा स्थिति सभी प्रक्रियाएं टाइमआउट टाइमर को रिलीज करने की प्रतीक्षा करेंगी, भले ही ग्राहक पहले ही बंद हो।

मैंने नेट की खोज की है और मुझे पता चला है कि PHP के माध्यम से इसे समझने का कोई तरीका नहीं है और मैंने पाया है कि कुछ लोगों ने इसके बारे में मुद्दा टिकट खोला है ताकि socket_last_error स्ट्रीम के बराबर हो। https://bugs.php.net/bug.php?id=34380

तो क्या यह जानने के लिए वैसे भी है कि जब भी FIN_WAIT संकेत उठाया जाता है या नहीं?

धन्यवाद,

उत्तर

1

मैं इसे stream_socket परिवार, ऐसा लगता है कि यह बहुत ही उच्च स्तर है जैसे संभव है नहीं लगता।

मैं बनाने के लिए एक बहुत hackish समाधान, मैं अगर यह आप के लिए काम करेंगे पता नहीं है की कोशिश की, है ना बहुत विश्वसनीय है:

<?php 
set_error_handler('my_error_handler'); 

function my_error_handler($no,$str,$file,$line) { 
    throw new ErrorException($str,$no,0,$file,$line); 
} 

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr); 
if (!$socket) { 
    echo "$errstr ($errno)\n"; 
} else { 
    while ($conn = stream_socket_accept($socket)) { 
    foreach (str_split('The local time is ' . date('n/j/Y g:i a') . "\n") as $char) { 
     echo $char; 
     try { 
      fwrite($conn,$char); 
     } catch (ErrorException $e) { 
      if (preg_match("/^fwrite\(\): send of 1 bytes failed with errno=([0-9]+) ([A-Za-z \/]+)$/",$e->getMessage(), $matches)) { 
        list($errno,$errstr) = array((int) $matches[1], $matches[2]); 
        if ($errno === 32) { 
          echo "\n[ERROR] $errstr"; // Broken pipe 
        } 
      } 
      echo "\n[ERROR] Couldn't write more on $conn"; 
      break; 
     } 
     fflush($conn); 
    } 
    fclose($conn); 
    } 
    fclose($socket); 
} 
echo "\n"; 
?> 

लॉन्च: php ./server.php

कनेक्ट: nc localhost 8000 | head -c1

सर्वर आउटपुट:

The loca 
[ERROR] Broken pipe 
[ERROR] Couldn't write more on Resource id #6 
+0

उत्तर के लिए जेनस धन्यवाद। जैसा कि आप जानते हैं कि स्ट्रीम को शोर करने के लिए कुछ डेटा भेजकर संभव नहीं है जब भी यह टूट जाता है या वर्तमान स्थिति भी नहीं है कि सर्वर क्लाइंट एक्शन के लिए इंतजार कर रहा है, इसलिए आपने जो सुझाव दिया है, मुझे नहीं लगता कि यह संभव है? – user1304594

संबंधित मुद्दे