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 ;
なぜあなたは仕事があるのか分かりません。手続きの中で身体をインライン化するかもしれない。タスクを実行することができれば、期待されるメッセージが失われる危険があります。 'Receive_Data'は異なるポート番号で呼び出されますか?もしそうでなければ、私はソケットを一度セットアップし、ソケットを 'Receive_Data'に渡すでしょう。 'Integer'Size'が32で、代わりに' Offset'によって 'Message_Size'を更新したいと思うかもしれません! (そして、 'Offset'は8ビットバイトの数になりますが、とにかく' Integer'を使うことはありません)。 –
申し訳ありませんが、更新されました。はい、私は別のポート番号で呼び出される関数を使用します。 –
クライアントにメッセージを送信する前に、メッセージを受け取るためにソケットを準備する必要がありますか?そして、プロシージャのスタック上で宣言された配列のアドレスを、そのプロシージャの呼び出し側に渡すことは、非常に悪い考えです**。 –