Problem med tftp-klient
Sitter och kodar på en tftp-klient nu men har fått lite problem.
Testar funktionerna för att skicka och ta emot datapaket men när jag skickar en read request till serven så får jag något konstigt tillbaka, jag får rätt opcode och blocknr på paket men inget mer.
Jag skickar alltså en read request med sendto() om att jag vill hämta en fil till tftp-servern.
Jag får tillbaka ett paket med recvfrom() som har opcoden 3 vilket stämmer för datapaket.
Men paket jag får tillbaka är bara på 4 byte.
Jag undrar om felet ligger i att jag kanske tar emot paketet på port 69, som är tftp-porten, vilken bara ska användas till read- och write-request. Kan det vara felet? Har jag missuppfattat en del hur socketen fungerar?
Eller kan det vara så att jag skickar fel read request till servern, fast då borde jag väl få errorpaket tillbaka, det får jag om skickar trams som read request.
Har ni några bra råd att ge. Kanske ser ni om jag glömmer något steg.
Tycker som att det där borde fungera.
Detta är en gammal skoluppift så jag har en skelettkod att jobba vidare på.
I deras skelett gör de följande:
tc->sock = socket(PF_INET, SOCK_DGRAM, 0);
tc->peer_addr.sin_family = PF_INET;
tc->peer_addr.sin_port = htons(69);
struct hostent *hent;
hent = gethostbyname(hostname);
memcpy(&tc->peer_addr.sin_addr,
hent->h_addr_list[0], sizeof(struct in_addr));
tc->addrlen = sizeof(struct sockaddr_in);
tc->sock = socket(PF_INET, SOCK_DGRAM, 0);
Sedan gör jag detta.
char concat[] = "";
´
strcat(concat,tc->fname); // fname innehåller strängen "name"
strcat(concat,"0");
strcat(concat,tc->mode); // mode innehåller strängen "octet"
strcat(concat,"0");
int s = TFTP_RRQ_HDR_LEN + TFTP_RRQ_LEN(tc->fname,tc->mode);
printf("s = %d\n",s);
struct tftp_rrq *rrq = malloc(s);
rrq->opcode = htons(1);
strcpy(rrq->req, concat);
struct tftp_data *td = malloc(512);
int send = sendto(tc->sock, rrq, s, 0, (struct sockaddr *)&(tc->peer_addr),tc->addrlen);
int recv;
recv = recvfrom(tc->sock,td,512,0,(struct sockaddr *)&(tc->peer_addr), &(tc->addrlen));
printf("opcode = %d\n",td->opcode);
printf("Blocknr= %d\n",td->blocknr);
printf("%s\n",concat);
printf("size of revc = %d\n",recv);
printf("%d\n",tc->peer_addr.sin_port);
structarna rrq och td ser ut så här:
struct tftp_rrq {
u_int16_t opcode;
char req[0];
};
struct tftp_data {
u_int16_t opcode;
u_int16_t blocknr;
char data[0];
};