資源簡介
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? 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? printf(“%02X?“?p[j]);
for(;j?16;?j++)
printf(“???“);
printf(“|“);
for(j?=?0;?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
評論
共有 條評論