📄 tftp.c
字号:
#include "netsocket.h"
#include "tftp.h"
unsigned short client_block;
struct sockaddr_in TFTPClientAddr;
int tftp_rcv_data(Uint8 *DataBuf,Uint32 Len,struct sockaddr_in ClientAdr);
int tftp_rcv_wrq(struct sockaddr_in ClientAdr);
int tftp_send_ack(struct sockaddr_in ClientAdr,int block);
SOCKET hTFTPSocket;
void tftp_rcv();
int tftp_init()
{
struct sockaddr_in mSocketAddr;
mSocketAddr.sin_family=AF_INET;
mSocketAddr.sin_addr.s_addr = INADDR_ANY;
mSocketAddr.sin_port=TFTP;
hTFTPSocket=socket(AF_INET, SOCK_STREAM, 0);
bind(hTFTPSocket,&mSocketAddr,sizeof(mSocketAddr));
MsgAsyncSelect(hTFTPSocket,FD_READ,&tftp_rcv);
return 0;
}
void tftp_rcv()
{
int i;
int BufLen;
struct sockaddr_in ClientAddr;
Uint8 DataBuf[1024];
struct tftphdr *tftp_hdr;
i=recvfrom(hTFTPSocket, (char *)DataBuf, 1024, 0, \
&ClientAddr,&BufLen);
if(i!=-1)
{
tftp_hdr = (struct tftphdr *)DataBuf;
switch (ntohs(tftp_hdr->th_opcode))
{
case RRQ:
break;
case WRQ:
tftp_rcv_wrq(ClientAddr);
break;
case DATA:
tftp_rcv_data(DataBuf,i,ClientAddr);
break;
case ACK:
break;
case ERROR:
break;
default:
break;
}
return ;
}
}
int tftp_rcv_wrq(struct sockaddr_in ClientAdr)
{
TFTPClientAddr=ClientAdr;
tftp_send_ack(ClientAdr,0);
client_block = 1;
tftp_put_begin();
return 0;
}
int tftp_send_ack(struct sockaddr_in ClientAddr,int block)
{
struct tftphdr tftp_ack;
int i;
tftp_ack.th_opcode = htons(ACK);
tftp_ack.th_block = htons(block);
i=-1;
while(i==-1)
{
i=sendto (hTFTPSocket,(char *)&tftp_ack,sizeof(struct tftphdr),0,&ClientAddr, \
sizeof(ClientAddr));
}
return 0;
}
int tftp_rcv_data(Uint8 *DataBuf,Uint32 Len, struct sockaddr_in ClientAddr)
{
struct tftphdr *tftp_hdr;
int len;
if(TFTPClientAddr.sin_port!=ClientAddr.sin_port)
{
return -1;
}
if((TFTPClientAddr.sin_addr.s_addr)!=(ClientAddr.sin_addr.s_addr))
{
return -1;
}
tftp_hdr = (struct tftphdr *)DataBuf;
if (client_block == ntohs(tftp_hdr->th_block))
{
len = Len - sizeof(struct tftphdr);
tftp_put((unsigned char *)tftp_hdr+sizeof(struct tftphdr), len);
tftp_send_ack(ClientAddr,client_block);
client_block++;
if (len < 512)
tftp_put_end();
}
else if (client_block > ntohs(tftp_hdr->th_block))
{
tftp_send_ack(ClientAddr, ntohs(tftp_hdr->th_block));
}
else
{
tftp_send_ack(ClientAddr, client_block);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -