2015-01-11 2 views
1

ADA의 소켓을 통해 헤더를 보내는 데 문제가 있습니다. 다음은 코드입니다.Ada - GNAT.Sockets로 HTTP 응답 보내기

Address.Addr := Addresses(Get_Host_By_Name(Host_Name), 1); 
    Address.Port := 80; 
    Create_Socket(Server); 
    Set_Socket_Option(Server, Socket_Level, (Reuse_Address, True)); 
    Bind_Socket(Server, Address); 
    Listen_Socket(Server); 
    Accept_Socket(Server, Socket, Address); 
    Channel := Stream(Socket); 

    Receive_Socket(Socket, Data, Offset); 
    for I in 1 .. Offset loop 
     Append(Request, Character'Val(Data(I))); 
    end loop; 

    String'Output(Channel, 
     "HTTP/1.1 200 OK" & CRLF & 
     "Date: Fri, 09 Jan 2015 01:08:54 GMT" & CRLF & CRLF & 
     "something" 
    ); 

클라이언트 Firefox 브라우저로 사용 중입니다. 내가 소켓을 통해 GET 요청을 읽을 때 그것은 모두 훌륭합니다. 이 문제는 응답을 보내려고 할 때 발생합니다. 따옴표로 묶인 코드의 마지막 줄 뒤에 내 브라우저는 HTTP/0.9 200 OK (라이브 HTTP 헤더를 통해 확인) 만 표시되고 전혀 내용이 표시되지 않습니다 (어떤 메시지는 단지 HTTP/1.1 200 OK을 보내기 때문에 조금 이상합니다).

약간의 도움을 주시면 감사하겠습니다. 미리 감사드립니다 :)

답변

6

String’Output "경계 또는 판별자를 포함하여 Item의 값을 스트림에 씁니다."(ARM 13.13.2 (21)).

String은 무기한 유형이므로 출력하려는 ​​문자열에 실제로 경계가 있으며 전송할 문자열의 첫 번째 문자를 4 바이트 2 진수로 나타내는 색인 인 문자열의 마지막 문자를 4 바이트 2 진수로 표시 한 다음 문자열을 반환합니다.

대신 String’Write을 사용하십시오 (ARM 13.13.2 (9) 참조).

+1

마지막으로 내 코드가 잘못되었다는 사실을 알게되었습니다. 해결책은 매우 간단했습니다. 나는 오랜 시간이 지난 후에 그걸 생각해 냈다. 그러나 그것은 좋은 교훈이었습니다. 당신의 충고가 옳았습니다. (필자는'Output' 대신'Write'를 사용해야했습니다.) 또 하나는 내가 쓰고 있던 소켓을 닫아야한다는 것이 었습니다. 내가받은 모든 지원에 감사드립니다. :) – TheUnnamed454

1

저는 Ada에 익숙하지 않지만 어쨌든 코드가 잘못되었습니다.

  • Socket에서 헤더를 읽으면 전체 헤더가 단일 읽기 내에 있다고 가정합니다. 대신 헤더의 끝 (CRLF 만있는 단일 행)을 얻을 때까지 소켓에서 행을 읽어야합니다.
  • 무엇이든지간에 Channel에 글을 씁니다. 대신 요청을받은 동일한 Socket에 글을 써야합니다.

브라우저 가져에만 HTTP/0.9 200 OK

당신은 아마 유용 아무것도 없기 때문에 브라우저에 의해 추가 된 의사 헤더를보고있다. 이 유효한 HTTP 헤더없이 무언가를 얻었 기 때문에 현실 HTTP에서 0.9 has no response header at all은 (즉이 없다 "HTTP/0.9"), 그래서 이것은 아마도 브라우저에 의해 구성되어 있습니다. 실제로 무슨 일이 일어나는지 보려면 패킷 캡처를 수행하십시오. Simon Wright의 the answer을보고이 가짜 데이터의 출처를 확인하십시오.

+0

Steffen,'Channel'은 실제로'Socket'을 대상으로하는'Stream'입니다. 그래서 여기서 문제가되지 않습니다. –

+0

내 잘못, 나는 충분히 가까이 보지 않았다. 그러나 당신의 대답과 함께 이것은 HTTP/0.9를 설명합니다. 즉, 브라우저는 가짜 데이터를 적절한 HTTP 헤더가 없기 때문에 HTTP/0.9로 해석합니다. –

+0

답장을 보내 주셔서 감사합니다.이 소켓에서 읽은 것이 현재로서는 좋지 않다는 것을 알고 있습니다. 그것은 단지 일시적인 해결책이었습니다. 'String'Output'을'String'Write'로 변경하면 브라우저가 아무것도 얻지 못하게됩니다. 나는 오늘 나중에 패킷 캡처로 그것을 확인하려고합니다. – TheUnnamed454