2017-09-17 16 views
0

이받을 GJS에 Gio.Socket.receive_from()를 사용하여, Gio.DataInputStream에서이 파일 기술자의 포장하여 Gio.Socket에서 읽을 가능성이 불가능하지만 때문에 commented here 등 :UDP 수신기 소켓에서 들어오는 메시지에서 원격 주소를 가져 오는 방법은 무엇입니까?

에 전달하기 전에 배열 인수를 복제해야합니다 GJS C 코드은 Socket.receive_from에 대한 호출을 작동시키고 수신 된 바이트 수 및 패킷 소스를 리턴합니다. 버퍼 내용은 실제로 변경된 버퍼가 해제 된 클론이므로 변경되지 않습니다.

따라서, 입력 인수 버퍼에 실제로 전달 buffer 아닌 인스턴스를 복제 클로닝 및 데이터 에 기록한다.

데이터 스트림으로부터 판독하는 것은 문제가되지 않지만, Gio.Socket.receive_from()Gio.Socket.remote_address은 정의되지 않았으므로 UDP 수신기에서 원격 주소를 가져올 수있는 유일한 방법입니다. 불행하게도 문서는 Gio.Socket.receive() 말할 같이 G_SOCKET_TYPE_DATAGRAM 들어

[...] 상기 수신 된 메시지가 buffer에 맞지 너무 큰 경우, size 바이트를 초과하는 데이터는이 있는지 명시 적 표시없이 폐기 될 발생했습니다.

그래서 난 그냥 주소를 가져 Gio.Socket.receive_from(new Uint8Array(0), null); 뭔가를하려고하면, 패킷은 삼킨하지만이 파일 기술자를 통해 읽으면 메시지가 어디에서 왔는지 나는 말할 수 없다. 패킷의 수신 주소를 가져 오는 또 다른 비파괴적인 방법이 있습니까?

+0

왜 데이터 그램을 복제하면 소스를 얻을 수 없습니까? – EJP

+0

죄송합니다, 제가 인용 한 의견은 완전히 명확하지 않습니다. 주소를 얻는 것은'GioSource.receive_from (buffer, cancellable)'에서 가능합니다 (GJS에서는'[size, address]'의 배열을 반환합니다). 그러나 GJS 클론은'buffer'에서 전달 된 args에 no 그것에 기록 된 데이터. 그러므로'Uint8Array (4096)'을 넘기면 데이터가 4KB의 null 바이트로 채워지게됩니다. 왜냐하면 데이터가 원래의 것이 아닌 복제 된 arg에 기록되기 때문입니다. –

+0

나는 나의 질문을 다소 명확하게했다. –

답변

1

데이터 그램 소켓을 사용 중이므로 Gio.Socket.receive_message()을 사용하고 Gio.SocketMsgFlags.PEEK 플래그를 전달해야합니다. 스트림 기반 소켓에서는 불가능하지만이 경우 각 읽기마다 보낸 사람 주소를 원하지는 않습니다.

개선 된 성능을 원하면 Gio.Socket.receive_messages()을 사용할 수 있습니다. 그러나 지금은 완전히 내성적인지 여부는 확실하지 않습니다.

+0

훌륭합니다. 나는이 일에 거의 희망을 포기했다. –