이받을 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);
뭔가를하려고하면, 패킷은 삼킨하지만이 파일 기술자를 통해 읽으면 메시지가 어디에서 왔는지 나는 말할 수 없다. 패킷의 수신 주소를 가져 오는 또 다른 비파괴적인 방법이 있습니까?
왜 데이터 그램을 복제하면 소스를 얻을 수 없습니까? – EJP
죄송합니다, 제가 인용 한 의견은 완전히 명확하지 않습니다. 주소를 얻는 것은'GioSource.receive_from (buffer, cancellable)'에서 가능합니다 (GJS에서는'[size, address]'의 배열을 반환합니다). 그러나 GJS 클론은'buffer'에서 전달 된 args에 no 그것에 기록 된 데이터. 그러므로'Uint8Array (4096)'을 넘기면 데이터가 4KB의 null 바이트로 채워지게됩니다. 왜냐하면 데이터가 원래의 것이 아닌 복제 된 arg에 기록되기 때문입니다. –
나는 나의 질문을 다소 명확하게했다. –