2014-04-07 8 views
1

작은 과제를 수행 중이며 한 걸음 더 나아갑니다. 작은 TCP 서버/클라이언트를 성공적으로 작성했지만 디렉토리 서버에 등록해야합니다. 이를 위해 DS에 "200 Success"로 회신 할 메시지를 보내야합니다.서버에 메시지 보내기 및 응답 인쇄하기

터미널에서 텔넷으로이 작업을 수행 할 때 서버에 연결하고 메시지를 전달하고 터미널 침을 "200 성공"으로 되돌립니다. 이제 Perl에서이 작업을 수행 할 때 소켓을 열어 (성공적으로) $ (여기서 $ reg는 소켓 이름)으로 메시지를 보냅니다.

print <$reg>; 

는 행운로 서버 응답을 얻을 :

print $reg "Message goes here"; 

나는 추가했습니다. 나는이 메시지를 다시 얻는 방법을 확신 할 수 없기 때문에 좀 더 붙어 있으며 올바르게 전송되는지 확신 할 수 없습니다. 여기 내 소켓은 이전의 주요 하위 호출입니다 :

# Server registration 
print &register . "\n"; 

sub register { 
my $reg = IO::Socket::INET->new (
    PeerHost => "server goes here", 
    PeerPort => port goes here, 
    Proto  => $protocol 
) or die "Failed to make socket for directory registration: $!\n"; 
print $reg "Register <my name> $ipaddr $port" . '\r'; #with required carriage return, this works in telnet too 
my $msg = <$reg>; 
print $msg; 

}

+2

스트림을 플러시 했습니까? 핸들이'autoflush'로 설정되지 않고 실제 메시지에 따라 메시지가 버퍼에 남아 있기 때문에 메시지가 전송되지 않았을 수 있습니다. 라인 엔딩을 사용하지 않는 메시지 프로토콜을 처리 할 때와 같은 문제가있었습니다. – Axeman

+0

스크립트 시작 부분에'| $ = 1'이 있는데, 자동 플러시를 처리해야합니다. 맞습니까? 나는 아직도 상대적으로 펄에 익숙하지 않다. – rusty

+0

코드의 다른 부분이 실행 취소되지 않는 한 그래야합니다. 명시적인 플러시를 시도하고 차이가 있는지 확인하십시오. – Axeman

답변

0

문제는 내 메시지가 올바른 구문을 가지고 있지 않은 것이 었습니다. 텔넷을 사용할 때 마지막에 \ r을 전달할 때 리턴 값을 받으면 서버에 필요한 \ n이 추가됩니다. 펄에서는 나는 단지 \ r을 통과시켰다. 아무런 \ n도 추가되지 않았고 내 키보드에 반환 키가 입력되지 않았기 때문에 서버는 단순히 메시지를 거부했습니다.

나를 도왔던 사람들에게 감사드립니다!

관련 문제