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 ;
왜 작업을 수행했는지 이해가 안됩니다. 프로 시저에서 몸을 인라인 할 수도 있습니다. 할 수있는 모든 작업을 수행하면 예상되는 메시지가 누락 될 위험이 있습니다. 'Receive_Data'는 다른 포트 번호로 호출됩니까? 그렇지 않다면 소켓을 한 번 설정하고 소켓을'Receive_Data'에 건네주기 때문입니다. 'Integer'Size'가 32 일 때, 대신'Offset'에 의해'Message_Size'를 업데이트하려고합니다! (그리고 'Offset'은 8 비트 바이트의 수, 어쨌든, 'Integer'로는 아무 것도 안됨). –
죄송합니다. 이제 업데이트되었습니다. 네, 다른 포트 번호로 호출하는 함수를 사용합니다. –
아마 클라이언트가 메시지를 보내달라고 요청하기 전에 메시지를 받기 위해 소켓을 준비해야합니까? 그리고 프로 시저 스택에 선언 된 배열의 주소를 해당 프로 시저의 호출자에게 전달하는 것은 매우 어려운 생각입니다 **. –