2017-02-01 2 views
0

C++UDP Client에서 여러 데이터 패키지를 수신하려면이 코드를 사용하고 있습니다. 패키지가 필요하면 을 사용하여 Request을 보내 C++ 클라이언트가 패키지를 보내도록하십시오. 나는이 과정을 여러 번 할 때, 나는 어떤 패키지를 그리워하고이 오류가 나타날 수GNAT.SOCKETS.SOCKET_ERROR : [11]`리소스를 일시적으로 사용할 수 없음

GNAT.SOCKETS.SOCKET_ERROR: [11] Resource temporarily unavailable

나는 클라이언트가 서버가 수신되기 전에 패키지를 보낼 수 있기 때문에 발생할 수 있습니다 생각하지만, 잘 모르겠어요. 그것을 해결할 수있는 방법이 있습니까 ?? 그게 문제라면 클라이언트가 UDP 메시지를 보내기 전에 내 서버를 준비 할 수있는 방법이 있습니까? 하지 주소 :

procedure RECEIVE_DATA (
          DEST_UDP_PORT  : In Integer; 
          SRC_UDP_PORT   : In Integer; 
          WAIT_TIME   : In DURATION; 
          MESSAGE_ADDRESS  : Out System.Address; 
          WAIT_RESULT   : Out Integer; 
          MESSAGE_SIZE   : Out Integer 
          ) is 


    Address : Sock_Addr_Type; 
    Socket : Socket_Type; 
    Channel : Stream_Access; 
    Receive_Timeout : constant Duration := WAIT_TIME; 
    Offset : Ada.Streams.Stream_Element_Count; 
    Data : Ada.Streams.Stream_Element_Array (1 .. 10000); 

begin 
    Initialize (Process_Blocking_IO => False); 
    WAIT_RESULT := 0; 
    MESSAGE_SIZE := 0; 
    -- Create Socket 
    Create_Socket (Socket, Family_Inet, Socket_Datagram); 
    Set_Socket_Option (Socket => Socket, 
         Option => (Gnat.Sockets.Receive_Timeout, Timeout => Receive_Timeout)); 

    --Bind Address 
    Address.Addr := Inet_Addr(DEFINE_IP_ADDR.IP_BOARD_ADDRESS); 
    Address.Port := Port_Type(DEST_UDP_PORT); 
    Bind_Socket (Socket, Address); 

    Channel := Stream (Socket, Address); 
    -- Receive Socket 
    Ada.Streams.Read (Channel.All, Data, Offset); 

    -- Close socket 
    Free (Channel); 
    Close_Socket (Socket); 
    WAIT_RESULT := 1; 
    MESSAGE_SIZE := Integer(Offset); 
    MESSAGE_ADDRESS := Data'Address; 
    Finalize; 
exception when E : others => 
     Ada.Text_IO.Put_Line 
     (Exception_Name (E) & ": " & Exception_Message (E)); 
     WAIT_RESULT := 0; 
     Free (Channel); 
     Close_Socket (Socket); 
     Finalize;  
end RECEIVE_DATA ; 
+0

왜 작업을 수행했는지 이해가 안됩니다. 프로 시저에서 몸을 인라인 할 수도 있습니다. 할 수있는 모든 작업을 수행하면 예상되는 메시지가 누락 될 위험이 있습니다. 'Receive_Data'는 다른 포트 번호로 호출됩니까? 그렇지 않다면 소켓을 한 번 설정하고 소켓을'Receive_Data'에 건네주기 때문입니다. 'Integer'Size'가 32 일 때, 대신'Offset'에 의해'Message_Size'를 업데이트하려고합니다! (그리고 'Offset'은 8 비트 바이트의 수, 어쨌든, 'Integer'로는 아무 것도 안됨). –

+0

죄송합니다. 이제 업데이트되었습니다. 네, 다른 포트 번호로 호출하는 함수를 사용합니다. –

+1

아마 클라이언트가 메시지를 보내달라고 요청하기 전에 메시지를 받기 위해 소켓을 준비해야합니까? 그리고 프로 시저 스택에 선언 된 배열의 주소를 해당 프로 시저의 호출자에게 전달하는 것은 매우 어려운 생각입니다 **. –

답변

0

는 다음과 같이 변경

Address.Addr := Inaddr_Any; 

이것은 당신이에서 받고있는 주소를 확인합니다. 전송할 때 주소 및 수신 할 때 주소를 설정하십시오.

관련 문제