home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.urbanrage.com
/
2015-02-07.ftp.urbanrage.com.tar
/
ftp.urbanrage.com
/
pub
/
tftp_test.c
< prev
next >
Wrap
C/C++ Source or Header
|
2007-02-15
|
4KB
|
140 lines
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include "tftp.h"
int setup_udp_socket(void) {
int sfd;
int option_on = 1;
int error;
int slen;
struct sockaddr_in saddr;
sfd = socket(PF_INET, SOCK_DGRAM, 0);
if (sfd < 0) {
perror("Couldn't open a socket");
exit(0);
}
setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *)&option_on,
sizeof(option_on));
/* set up sock_addr structure */
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("192.168.20.28");
saddr.sin_port = htons(6943);
error = connect(sfd, (struct sockaddr*)&saddr, sizeof(saddr));
if (error < 0) {
perror("couldn't bind socket to address");
close(sfd);
exit(0);
}
return sfd;
}
int main (int argc, char* argv[]) {
int fd;
int sfd;
int err;
int n;
char buffer[2048];
unsigned long i = 0;
tf_rwrq_t req;
tf_ack_t ack;
tf_data_t data;
tftp_t res;
char* ptr;
sfd = setup_udp_socket();
memset(&ack, 0, sizeof(ack));
ack.op = ACK;
memset(&req, 0, sizeof(req));
req.op = RRQ;
snprintf(req.buffer, sizeof(req.buffer), "debug.log%c0400", 0);
write(sfd, &req, strlen(req.buffer)+8);
ptr = (char*)&res;
do {
n = recv(sfd, &res, sizeof(res), 0);
if (n > 0) {
ptr[n] = 0;
switch (res.op) {
case DATA : {
fprintf(stderr, "%s", res.data.data);
ack.block = res.data.block;
write(sfd, &ack, sizeof(ack));
}; break;
default : {
fprintf(stderr, "\n----[%d][%d] %s\n", res.op, res.err.error, res.err.errmsg);
};
};
}
} while (n > 512);
req.op = WRQ;
snprintf(req.buffer, sizeof(req.buffer), "test.out%c0600", 0);
write(sfd, &req, strlen(req.buffer)+8);
n = recv(sfd, &res, sizeof(res), 0);
ptr[n] = 0;
if (n > 0) {
switch(res.op) {
case ERR : { fprintf(stderr, "error on write: %s\n", res.err.errmsg); } break;
case ACK :
data.op = DATA;
data.block = 0;
snprintf(data.data, sizeof(data.data), "this is a test.\n");
write(sfd, &data, strlen(data.data)+4);
}
}
n = recv(sfd, &res, sizeof(res), 0);
ptr[n] = 0;
if (n > 0) {
switch(res.op) {
case ERR : { fprintf(stderr, "not here: %s\n", res.err.errmsg); } break;
case ACK : { fprintf(stderr, "write finished successfully\n"); } break;
};
}
/* test timeout */
req.op = WRQ;
snprintf(req.buffer, sizeof(req.buffer), "test.out%c0600", 0);
write(sfd, &req, strlen(req.buffer)+8);
n = recv(sfd, &res, sizeof(res), 0);
ptr[n] = 0;
if (n > 0) {
switch(res.op) {
case ERR : { fprintf(stderr, "not here either: %s\n", res.err.errmsg); } break;
case ACK : { fprintf(stderr, "got ack, start twiddling\n"); } break;
};
}
n = recv(sfd, &res, sizeof(res), 0);
ptr[n] = 0;
if (n > 0) {
switch(res.op) {
case ERR : { fprintf(stderr, "timeout err?: %s\n", res.err.errmsg); } break;
case ACK : { fprintf(stderr, "got retransmitted ack\n"); } break;
};
}
n = recv(sfd, &res, sizeof(res), 0);
ptr[n] = 0;
if (n > 0) {
switch(res.op) {
case ERR : { fprintf(stderr, "timeout err?: %s\n", res.err.errmsg); } break;
case ACK : { fprintf(stderr, "no! ack here bad\n"); } break;
};
}
}