2011-02-04 3 views
7

그래서 mIRC가 포트 1235에서 수신 대기 (이 포트를 가지고 있습니다)를하고 포트를 로컬 호스트 서버에 연결하려고했습니다.PHP 소켓이 반 작동합니다

내 로컬 호스트는 mIRC가 다른 컴퓨터 (lan 내부)에서 실행되는 깨끗한 Apache + PHP입니다.

스크립트 작동 절반 오른쪽으로 : 그것은 1235 포트 2)는 전송에 연결 1) $ 내가 2.1)하지만 MSG가 받았다되지 않은 다른 측면에서 (일명 나는 양말 읽을 이벤트를 얻을 수 있지만, 어떤 텍스트는 '끝'이 동안 기능이 존재하지 않는 경우에만 작동 메시지 드럼 롤 5) 때 그것은 종료) 모든 수신 메시지가 4 correclty 읽고) 3) 팝업 없습니다. 5.1) 일명 Inifi-loading. 소켓이 '말'여기

내가 php.net에서 발견 간단한 예제 코드입니다, 사전에 감사합니다 :)를 통해 닫힐 때 그것은 단지

<?php 
//The Client 
error_reporting(E_ALL); 

$address = "192.168.1.101"; 
$port = 1235; 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
} else { 
    echo "socket successfully created.\n"; 
} 

echo "Attempting to connect to '$address' on port '$port'..."; 
$result = socket_connect($socket, $address, $port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
} else { 
    echo "successfully connected to $address.\n<br>"; 
} 
$allow = true; 
$i = 0; 
while ($allow == true) 
{ 
    $i++; 
    echo "Sending $i to server.\n<br>"; 
    socket_write($socket, $i, strlen($i)); 

    $input = socket_read($socket, 2048); 
    if ($input == 'end') { 
     $allow = false; 
    } 
    echo "Response from server is: $input\n"; 
    sleep(5); 
} 

echo "Closing socket..."; 
socket_close($socket); 
?> 

이 내가 무엇을 얻을 에코를 보여줍니다 브라우저에서 '끝'이라고 말한 후

소켓이 성공적으로 생성되었습니다. 포트 에 ''192.168.1.101 '에 연결하려고 시도했습니다 ...'1235 '... 성공적으로 192.168.1.101에 연결되었습니다. 서버에 1을 보냅니다. 서버에서 응답은 다음과 같습니다 서버에서 확인 응답은 다음과 같습니다 끝

이 mIRC를에

:

시험 : 89.152.172.21이입니다! 난 (60)는 "읽기"곱하고, 그 시간 동안 작동 왼쪽 않았다면 는 인용구

근접 읽기 "보내는 N + 서버 1" 그러나 이것은 단지 양말 가까이 후 쇼 (또는을 stoping하여 그동안)

+1

당신이 그것을 실행할 때 뱉어내는'echos '를 게시 할 수 있습니까? 디버깅에 도움이 될 수 있습니다. – xil3

+0

가 'echos' 스팟을 게시하도록 업데이트했습니다 :) – MoshMage

답변

2

당신은 "일반"socket_write()socket_read() 통화 있습니다.불행히도 소켓 함수는 (BSD 소켓에서 상속 된 동작)으로 이 신뢰할 수 없습니다. 반드시 지정된 버퍼에서 모든 바이트를 기록하지 않습니다)

socket_write (: 당신은

PHP 매뉴얼 견적 (... 그것은 소리가 나는 것처럼 홀수) socket_write()를 호출하고 실제로 바이트를 작성하는 기대할 수 없다. 네트워크 버퍼 등에 따라 버퍼가 크더라도 일정량의 데이터, 심지어 1 바이트 만 기록된다는 것이 맞습니다. 주의해서 나머지 데이터를 전송하는 것을 잊지 않도록주의해야합니다.

원하는만큼 쓸 수있을 때까지 쓰여진 바이트 수를 확인하고 다시 시도해야합니다.

같은 내용이 읽혀집니다. 읽기 통화는 사용자가 또는 그 이하의 번호로을 요청할 수 있으며 통화를 다시 시도해야합니다.

것은 수도가 전송 완료 데이터 나 수도이 소켓하는 찾을 select() 전화를 차단에 소켓을 설정 한 다음 전화 루프에서 읽기/쓰기, 또는 (똑같이 끔찍한)를 사용해야합니다. 당신이 그런 피타가 아니다 API를 원하는 경우에


, 다음 신뢰할 수있는 읽기이있는 대신 streams을 사용/기록합니다.

반드시 PHP가 필요하지 않은 경우, 수명이 긴 네트워크 연결이있는 프로그램의 경우 특별히 설계된 서버/환경 인 Node JS을보십시오.

+0

그건 설명 많이. 또한 이러한 상세한 답변을 주셔서 감사합니다. 저는이 기능을 사용할 수있는 희망을 잃었습니다. 스트림을 확인하고 확인하는 것이 더 쉬워 보이고 Node.js도 검사 할 것입니다. 정확히 원하는 것 같기 때문입니다. – MoshMage

0

변경

socket_write($socket, $i, strlen($i)); 

사람 :

socket_write($socket, strval($i), strlen(strval($i))); 

PHP가 문자열을 필요로하는 곳에서 정수를 제공하고 있습니다. 설명서의주의 사항 중 하나에서

+3

이것은 중요하지 않아야합니까? – zanlok

+0

그랬더라도 여전히 mIRC에서 0Rcvd 바이트를 얻습니다. – MoshMage

0

: 새로운 라인 받았다 될 때까지 http://php.net/manual/en/function.socket-write.php

일부 클라이언트 (예를 들어 플래시의 XMLSocket에가) 읽기 이벤트가 발생하지 않습니다.

그래서 코드를 변경해보십시오 :

socket_write($socket, $i, strlen($i)); 에 : socket_write($socket, $i.'\n', strlen($i)+1);

+0

실제 개행을 큰 따옴표로 묶습니다. – igorw