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 >
C/C++ Source or Header  |  2007-02-15  |  4KB  |  140 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. #include <sys/types.h>
  6. #include <sys/mman.h>
  7. #include <sys/un.h>
  8. #include <netinet/in.h>
  9. #include <netinet/udp.h>
  10. #include <fcntl.h>
  11. #include <string.h>
  12.  
  13. #include <errno.h>
  14.  
  15. #include "tftp.h"
  16.  
  17. int setup_udp_socket(void) {
  18.    int                sfd;
  19.    int                option_on = 1;
  20.    int                error;
  21.    int                slen;
  22.    struct sockaddr_in saddr;
  23.  
  24.    sfd = socket(PF_INET, SOCK_DGRAM, 0);
  25.    if (sfd < 0) {
  26.       perror("Couldn't open a socket");
  27.       exit(0);
  28.    }
  29.    
  30.    setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *)&option_on,
  31.               sizeof(option_on));
  32.  
  33.    /* set up sock_addr structure */
  34.    memset(&saddr, 0, sizeof(saddr));
  35.    saddr.sin_family = AF_INET;
  36.    saddr.sin_addr.s_addr = inet_addr("192.168.20.28");
  37.    saddr.sin_port = htons(6943);
  38.  
  39.    error = connect(sfd, (struct sockaddr*)&saddr, sizeof(saddr));
  40.    if (error < 0) {
  41.       perror("couldn't bind socket to address");
  42.       close(sfd);
  43.       exit(0);
  44.    }
  45.  
  46.    return sfd;
  47. }
  48.  
  49. int main (int argc, char* argv[]) {
  50.    int              fd;
  51.    int              sfd;
  52.    int              err;
  53.    int              n;
  54.    char             buffer[2048];
  55.    unsigned long    i = 0;
  56.    tf_rwrq_t        req;
  57.    tf_ack_t         ack;
  58.    tf_data_t        data;
  59.    tftp_t           res;
  60.    char*            ptr;
  61.  
  62.    sfd = setup_udp_socket();
  63.  
  64.    memset(&ack, 0, sizeof(ack));
  65.    ack.op = ACK;
  66.    memset(&req, 0, sizeof(req));
  67.    req.op = RRQ;
  68.    snprintf(req.buffer, sizeof(req.buffer), "debug.log%c0400", 0);
  69.    write(sfd, &req, strlen(req.buffer)+8);
  70.    ptr = (char*)&res;
  71.    do {
  72.      n = recv(sfd, &res, sizeof(res), 0);
  73.      if (n > 0) {
  74.        ptr[n] = 0;
  75.        switch (res.op) {
  76.        case DATA : {
  77.          fprintf(stderr, "%s", res.data.data);
  78.          ack.block = res.data.block;
  79.          write(sfd, &ack, sizeof(ack));
  80.        }; break;
  81.        default : {
  82.          fprintf(stderr, "\n----[%d][%d] %s\n", res.op, res.err.error, res.err.errmsg);
  83.        };
  84.        };
  85.      }
  86.    } while (n > 512);
  87.    req.op = WRQ;
  88.    snprintf(req.buffer, sizeof(req.buffer), "test.out%c0600", 0);
  89.    write(sfd, &req, strlen(req.buffer)+8);
  90.    n = recv(sfd, &res, sizeof(res), 0);
  91.    ptr[n] = 0;
  92.    if (n > 0) {
  93.      switch(res.op) {
  94.      case ERR : { fprintf(stderr, "error on write: %s\n", res.err.errmsg); } break;
  95.      case ACK :
  96.        data.op = DATA;
  97.        data.block = 0;
  98.        snprintf(data.data, sizeof(data.data), "this is a test.\n");
  99.        write(sfd, &data, strlen(data.data)+4);
  100.      }
  101.    }
  102.    n = recv(sfd, &res, sizeof(res), 0);
  103.    ptr[n] = 0;
  104.    if (n > 0) {
  105.      switch(res.op) {
  106.      case ERR : { fprintf(stderr, "not here: %s\n", res.err.errmsg); } break;
  107.      case ACK : { fprintf(stderr, "write finished successfully\n"); } break;
  108.      };
  109.    }
  110.    /* test timeout */
  111.    req.op = WRQ;
  112.    snprintf(req.buffer, sizeof(req.buffer), "test.out%c0600", 0);
  113.    write(sfd, &req, strlen(req.buffer)+8);
  114.    n = recv(sfd, &res, sizeof(res), 0);
  115.    ptr[n] = 0;
  116.    if (n > 0) {
  117.      switch(res.op) {
  118.      case ERR : { fprintf(stderr, "not here either: %s\n", res.err.errmsg); } break;
  119.      case ACK : { fprintf(stderr, "got ack, start twiddling\n"); } break;
  120.      };
  121.    }
  122.    n = recv(sfd, &res, sizeof(res), 0);
  123.    ptr[n] = 0;
  124.    if (n > 0) {
  125.      switch(res.op) {
  126.      case ERR : { fprintf(stderr, "timeout err?: %s\n", res.err.errmsg); } break;
  127.      case ACK : { fprintf(stderr, "got retransmitted ack\n"); } break;
  128.      };
  129.    }
  130.    n = recv(sfd, &res, sizeof(res), 0);
  131.    ptr[n] = 0;
  132.    if (n > 0) {
  133.      switch(res.op) {
  134.      case ERR : { fprintf(stderr, "timeout err?: %s\n", res.err.errmsg); } break;
  135.      case ACK : { fprintf(stderr, "no! ack here bad\n"); } break;
  136.      };
  137.    }
  138. }
  139.  
  140.