• 大小: 21KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: tftp  c语言  源码  

资源简介

tftp服务器c源码,初学者非常好的参考代码。包括客户端和服务器端两个文件。

资源截图

代码片段和文件信息

/* tftp client demo */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include “tftpc.h“

static inline char conv_char(char ch)
{
ch = ch & 0xff;
if((ch < 0x20) || ((unsigned char)ch > 0x7f))
return ‘.‘;
return ch;
}

void dump_mem(const char *tip void *base int size)
{
unsigned char *p = base;
int rows = size / 16;
int rest = size % 16;
int i j;
printf(“[%s len = %d]\n“ tip size);
for(i = 0; i < rows; i++) {
printf(“0x%p:“ p);
for(j = 0; j < 16; j++)
printf(“%02X “ p[j]);
printf(“|“);
for(j = 0; j < 16; j++)
printf(“%c“ conv_char(*p++));
printf(“\n“);
}
printf(“0x%p:“ p);
for(j = 0; j < rest; j++)
printf(“%02X “ p[j]);
for(;j < 16; j++)
printf(“   “);
printf(“|“);
for(j = 0; j < rest; j++)
printf(“%c“ conv_char(p[j]));
printf(“\n“);
}

size_t read_with_select(int fd void *buffer size_t size int flags struct sockaddr *addr socklen_t *addrlen int tout)
{
    #include 
    fd_set rd_fds;
    struct timeval timeout;
    timeout.tv_sec = tout;
    timeout.tv_usec = 0;
    FD_ZERO(&rd_fds);
    FD_SET(fd&rd_fds);
    if(select(fd + 1 &rd_fds NULL NULL &timeout) > 0)
    {
return recvfrom(fd buffer size flags addr addrlen);
}
return -1;
}

size_t send_to(int sockfd void *buf size_t len int flags struct sockaddr *addr socklen_t addrlen)
{
dump_mem(“SEND“ buf len);
return sendto(sockfd buf len flags addr addrlen);
}

size_t recv_from(int sockfd void *buf size_t len int flags struct sockaddr *addr socklen_t *addrlen int tout)
{
if(tout == 0)
tout = 20;
*addrlen = sizeof(struct sockaddr);
len = read_with_select(sockfd buf len flags addr addrlen tout);
dump_mem(“RECV“ buf len);
return len;
}

int make_req(char *outbuf int rw char *filename)
{
char *p = &outbuf[2];
outbuf[0] = 0x00;
outbuf[1] = rw;
strcpy(p filename);
p += (strlen(filename) + 1);
strcpy(p “octet“);
p += (strlen(“octet“) + 1);
//----------------------------------->
// no options
//<-----------------------------------
return (int)p - (int)outbuf;
}

int make_ack(char *outbuf char *package int *blknumber)
{
switch(package[1])
{
case TFTP_OPC_DATA:
memcpy(outbuf package 4);
outbuf[1] = TFTP_OPC_ACK;
*blknumber = ntohs(*((unsigned short*)&package[2]));
break;
case TFTP_OPC_OACK:
memset(outbuf 0 4);
outbuf[1] = TFTP_OPC_ACK;
*blknumber = 0;
break;
case TFTP_OPC_ERROR:
break;
}
return package[1];
}

int send_req(int sockfd char *ip unsigned short port int rw char *filename)
{
unsigned char buffer[512];
struct sockaddr_in srvAddr;
socklen_t len;

bzero(&srvAddr sizeof(srvAddr));
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(port);
inet_pton(AF_INET ip &srvAddr.sin_addr.s_addr);
len = make_req(buffer rw filename);
if(send_to(sockfd buffer len 0 (struct sockaddr*)&srvAddr size

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     目录          0  2009-02-19 16:45  tftp服务器源码

     目录          0  2009-02-19 16:45  tftp服务器源码\tftp-1.0-0

     文件       5679  2009-02-17 14:45  tftp服务器源码\tftp-1.0-0\tftpc-1.c

     文件       8370  2009-02-18 12:06  tftp服务器源码\tftp-1.0-0\tftpc-2.c

     文件       1029  2009-02-17 14:19  tftp服务器源码\tftp-1.0-0\tftpc.h

     文件       3493  2009-02-18 15:37  tftp服务器源码\tftp-1.0-0\udp-broadcast.c

     目录          0  2009-02-19 16:45  tftp服务器源码\tftp-1.0-1

     文件        197  2006-12-18 04:24  tftp服务器源码\tftp-1.0-1\Makefile

     文件       1709  2006-12-18 04:19  tftp服务器源码\tftp-1.0-1\tftp.h

     文件      27920  2006-12-18 04:19  tftp服务器源码\tftp-1.0-1\tftpc.c

     文件      25001  2006-12-18 04:19  tftp服务器源码\tftp-1.0-1\tftpd.c

----------- ---------  ---------- -----  ----

                73398                    11


评论

共有 条评论