⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tftp.c

📁 这是基于TI公司的DSP TMS320DM642而开发的TCP/UDP协议
💻 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 + -