Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Nov 2010 04:12:49 -0800
From:      "Ronald F. Guilmette" <rfg@tristatelogic.com>
To:        freebsd-net@freebsd.org
Subject:   Implementing a trivial TFTP client?
Message-ID:  <41880.1290514369@tristatelogic.com>

next in thread | raw e-mail | index | archive | help

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.


Regards,
rfg


P.S.  If possible, please answer on-list.   Otherwise my geeky spam filter
may cause me to miss your reply.  Thanks.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?41880.1290514369>