资源简介
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
相关资源
- c语言RSA算法 这是一个完整的rsa算法
- 严蔚敏《数据结构》的全部代码实现
- LinuxC语言实现CP命令(edsionte.com)
- C语言指针详解__ppt文件
- FTP客户端程序,c语言编写
- 易语言D3D模块源码
- c++ builder实现文件粉碎机的源码
- C语言N皇后打印图形版
- Head First_深入浅出C语言(中文版)_带
- 唯一可译码源代码c语言 含报告
- 数据结构课程设计-班级通讯录
- AES密码学课程设计带报告
- 哈希表操作c语言版
- C语言版拼音输入法源代码
- C语言 真值表
- 51单片机C语言电流电压测量代码
- C语言编写Windows界面程序新手必看!附
- HMAC-MD5 C语言算法
- 公交信息查询系统 C语言.doc
- Flappy Bird C语言代码
- C语言课程设计—图书信息管理系统
- 机器人灭火比赛源程序C语言版本
- 支持向量机的C语言程序源码
- 矢量量化的C语言实现
- C语言实现的文件存储引擎
- 极其强大的C语言学生成绩管理系统(
- BACNet C语言代码,简单实用
- 能够移动的小方块,很多年前用C语言
- C语言编程流程图自动生成
- 二进制乘法多种方式 C语言
评论
共有 条评论