2017-02-01 22 views
0

私はC++UDP Clientからいくつかのデータパッケージを受け取るためにこのserverを使用しています。 私はパッケージを必要とするときC++クライアントがパッケージを送信するために、Client UDPを使用してRequestを送信します。私は数回このプロセスを行うと、私はいくつかのパッケージを欠場し、このエラーが表示されます。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; 

を行いますないあなたのアドレス。送信時にあなたのアドレスを設定し、受信時には

関連する問題