Implementing a trivial TFTP client?
Aleksandr A Babaylov
. at babolo.ru
Tue Nov 23 13:42:00 UTC 2010
On Tue, Nov 23, 2010 at 04:12:49AM -0800, Ronald F. Guilmette wrote:
> I have been attempting to implment a trivial sort of TFTP client from
> scratch, and its been somewhat of a humbling experience so far, and
> its taught me that I don't know quite as much about BSD socket programming
> as I though I did.
>
> So anyway, maybe some kind soul here would be willing to help me out and
> offer me some guidance.
>
> I'm not going to go over thet TFTP protocol here. That's well documented
> elsewhere. My question is really pretty simple: What would be the proper
> sequence of socket-related kernel calls necessary to implement a TFTP
> client that just simply connected to a TFTP server, and then sent (wrote)
> one file consisting of less than 512 bytes of data (i.e. just one packet's
> worth)?
>
> I've been trying the following sequence, and my code is kinda-sorta working,
> but apparently not quite (because the file never actually gets there):
>
> socket()
> bind() /* grab a fixed local port# */
> /* NOTE: sin_addr=INADDR_ANY and sin_port=0 */
> sendto() /* send the initial WRQ packet */
> recvfrom() /* get the initial ACK packet */
> connect() /* now that we know what port# the sever wants to talk
> to us on, we can "connect" our existing socket to
> that specific port# on the server's side */
> send() /* Send the data packet */
> recv() /* receive the data ACK packet */
>
> Obviously, I am leaving out all of the grubby little details. I just want
> to focus on the proper sequence of socket primitive calls to make a trivial
> TFTP client.
>
> So, ah, does the above sequence look reasonable for that job? If not, where
> have I gone wrong?
>
> It does appear that the initial few calls are doing what they should, and
> the connection does start up, lickety split. But then after that, ACK
> responses to the data packets seem to arrive VERY VERY slowly, and although
> the remote TFTP daemon _does_ create the new output file up on the server
> (see the tftp "-w" option) the file never seems to get any bigger than 0
> bytes in length. :-(
>
> My guess is that I'm doing multiple things in a substantially Wrong way.
>
> Any guidance would be appreciated.
Try
ktrace -i tftp
and look at
kdump
to see how it works
More information about the freebsd-net
mailing list