Hello, everyone. I'm trying to understand the SANE network protocol. I sent a SANE_NET_GET_DEVICES request to a SANE daemon running on a machine in my network, and got the following response back :
"\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x17genesys:libusb:001:002\x00\x00\x00\x00\x06""Canon\x00\x00\x00\x00\tLiDE 200\x00\x00\x00\x00\x10""flatbed scanner\x00\x00\x00\x00\x01" According to the documentation, this means that the request has been completed with SANE_STATUS_GOOD. The response should thus contain a "pointer to a NULL-terminated array of SANE_Device pointers". However, the first SANE_Word after the status is 2, which is assumed to be the length of the SANE_Device array. The next SANE_Word is a 0, whose purpose is unknown to me. Four consecutive SANE_String values follow, in line with the definition of a SANE_Device, but the whole packet ends with a SANE_Word with value 1. I had a look at existing implementations of the SANE network protocol and there are generally two approaches that I've seen : * The first one is to completely ignore the value before each of the elements of the array, and the value following the whole array. This is what's done by jFreeSane (https://github.com/sjamesr/jfreesane/blob/master/src/main/java/au/com/southsky/jfreesane/SaneInputStream.java#L75). * The second one is to expect the value before each of the elements of the array to be zero, treating it is a "this record is valid" flag (i.e. zero indicates validity). The value that comes after the whole array is still ignored. This is what's done by WinSANE/WiaSANE (https://github.com/mback2k/wiasane/blob/master/winsane/winsane_session.cpp#L370) and SANEWinDS (https://sourceforge.net/p/sanewinds/code/ci/master/tree/SANEWinDS/classSANE.vb#l558). These implementations apply the same behaviour to other arrays as well, most notably the ones returned by SANE_NET_GET_OPTION_DESCRIPTORS. I would really like to get some clarification on what's the correct behaviour of the client with regard to the array/pointer data returned from the SANE server. I have to admit that the meaning of a "pointer" in a network context is rather cryptic to me : the only scenario in which something could be called a pointer inside a network packet is to instruct the client to skip over a certain area in said packet - but in that case, what's the point of sending the data anyway? Thanks in advance, Daniel -- sane-devel mailing list: sane-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/sane-devel Unsubscribe: Send mail with subject "unsubscribe your_password" to sane-devel-requ...@lists.alioth.debian.org