📄 +
字号:
#define MAX_UDP_SOCKET_BUFFERS 1
char tempbuf[512];
char packetno;
#memmap xmem
#use crc16. lib
#use "dcrtcp.lib"
#define ERR_OTHER 0
#define ERR_NOTFOUND 1
#define ERR_ACCESS 2
#define ERR_NOSPACE 3
#define ERR_ILLEGAL 4
#define ERR_PORT 5
#define ERR_EXISTS 6
#define ERR_NOUSER 7
#define TEST_XMODEM
#define SOH 0x01
#define STX Ox02
#define EOT Ox04
#define ACK Ox06
#define NAK 0x15
#define CAN 0x18
#define CTRLZ Ox1A
#define DLY_1S 1000
#define MAXRETRANS 25
#define DINBUFSIZE 1023
#define DOUTBUFSIZE 255
#define DPORTSPEED 9600L
#define _outbyte serDputc
#define _inbyte xm_serDgetc
int xm_serDgetc(int msdelay);
int xm_serDgetc(int msdelay)
{
long time: int res;
time = MS_TIMER + msdelay;
for (;;)
{
res = serDgetc();
if (MS - IMER >= time)
break;
if (res != - 1)
break;
}
return res;
}
int check(int crc, char *buf, int sz)
{
unsigned tcrc;
int i;
char cks;
if (crc)
{
crc = (unsigned)crc16_ccitt(buf, sz)tcrc = (buf[sz] << 8) +
buf[sz + 1];
if (crc == tcrc)
return 1;
}
else
{
cks = 0;
for (i = 0; i < sz; ++i)
{
cks += buf[i];
}
if (cks == buf[sz])
return 1;
}
return 0;
}
void flushinput(void)
{
while (_inbyte(((DLY_1S) *3); 1) >= 0)
;
}
struct RunTimeContext
{
udp_Socket *m_pSocket;
char m_pBuffer[1024];
unsigned long m_dwTimeOut;
};
void SendErrorMsg(struct RunTimeContext *pRunTime, char type, char
*pMsg)
{
char buffer[1024];
memset(buffer, 0x00, sizeof(buffer));
buffer[0] = 0;
buffer[1] = 5;
buffer[2] = 0;
buffer[3] = type;
strcpy(buffer + 4, pMsg);
udp_send(pRunTime->m_pSocket, buffer, strlen(pmsg) + 5);
printf("Error message <%d>'%s'was sent \n ", type, pMsg);
}
void SendAckMsg(struct RunTimeContext *pRunTime, int block)
{
char buffer[1024];
memset(buffer, 0x00, sizeof(buffer));
buffer[0] = 0;
buffer[1] = 4;
buffer[2] = ((char*) &block)[1];
buffer[3] = ((char*) &block)[0];
udp_send(pRunTime->m_pSocket, buffer, 4);
printf("ACK <%d> was sent\n", block);
}
int GetDataPkt(struct RunTimeContext *pRunTime, int iBlock)
{
int iACKBlock;
int iRetval;
unsigned long dwStartTime;
dwStartTime = SEC_TIMER;
while (1)
{
if (SEC_TIMER > (dwStartTime + pRunTime->m_dwTimeOut))
{
printf("TIMEOUT on reading data packet; resending ACK.\n");
SendAckMsg(pRunTime, iBlock - 1);
dwStartTime = read_rtc();
}
tcp_tick(pRunTime->m_pSocket);
iRetval = udp_recv(pRunTime->m_pSocket, pRunTime->m_pBuffer,
sizeof(pRunTime->m_pBuffer));
if (iRetval > 0)
{
switch (pRunTime->m_pBuffer[1])
{
case 3;
{
iACKBlock = pRunTime->m_pBuffer[3] + (256 *pRunTime
->m_pBuffer[2]);
printf("Got data pkt <%d>\n", iACKBlock);
if (iACKBlock == iBlock)
{
SendAckMsg(pRunTime, iBlock);
return iRetval;
}
}
break;
case 5:
{
return - 1;
}
break;
default:
{
SendErrorMsg(pRunTime, ERR_ILLEGAL, "Expected DATA");
return - 1;
}
break;
}
}
}
}
int ProcessWriteReq(struct RunTimeContext *pRunTime)
{
int iBlock;
int iRetval;
SendAckMsg(pRunTime, 0);
iBlock = 0;
while (1)
{
iBlock++;
iRetval = GetDataPkt(pRunTime, iBlock);
if (iRetval == - 1)
{
return 1;
}
iRetval -= 4;
printf("send %d block\n", iBlock);
memcpy(tempbuf, pRunTime->m_pBuffer + 4, iRetval);
if (iBlock == 1)
praparetransmit(tempbuf, iRetval);
else
{
xmodemTransmit(tempbuf, iRetval);
}
if (iRetval < 512)
{
printf("<--END OF RECEIVED FILE\n\n");
return 0;
}
}
}
int praparetransmit(unsigned char *src, int srcsz)
{
char xbuff[1030];
int c, retry, crc, datasz;
datasz = srcsz;
crc = - 1;
memcpy(&xbuff[0], Src, datasz);
while (tempbuf[datasz - 1] != 0)
{
for (retry = 0; retry < 16; ++retry)
{
if ((c = _inbyte((DLY_1S) << 1)) >= 0)
{
switch (c)
{
case 'C':
crc = 1;
xmodemTransmit(xbuff, datasz);
return ;
case NAK:
crc = 0;
xmodemTransmit(xbuff, datasz);
return ;
default:
break;
}
}
}
}
}
int xmodemTransmit(unsigned char *src, int srcsz)
{
char xbuff[1030];
char ccks;
int i, c, len, retry, bufsz, crc, trantime;
unsigned int ccrc;
crc = - 1;
len = 0;
bufsz = 128;
trantime = srcsz / bufsz;
if (trantime < 4)
trantime = trantime + 1;
start: xbuff[0] = SOH;
xbuff[1] = packetno;
xbuff[2] = - packetno;
c = srcsz - len;
if (c > bufsz)
c = bufsz;
if (c > 0)
{
memcpy(&xbuff[3], &src[len], c);
if (c < bufsz)
{
xbuff[3+c] = CTRLZ;
memset(&xbuff[c + 4], CTRLZ, bufsz - c - 1);
}
}
if (crc)
{
ccrc = crc16_ccitt(&xbuff[3], bufsz);
xbuff[bufsz + 3] = (ccrc >> 8) &OxFF;
xbuff[bufsz + 4] = ccrc &OxFF;
}
else
{
ccks = 0;
for (i = 3; i < bufsz + 3; ++i)
{
ccks += xbuff[i];
}
xbuff[bufsz + 3] = ccks;
}
for (retry = 0; retry < MAXRETRANS; ++retry)
{
for (i = 0; i < bufsz + 4+(crc ? 1 : 0); ++i)
{
_outbyte(xbuff[i]);
}
printf("serial receive %d packetno\n", packetno);
memset(&tempbuf[len], 0, bufsz);
trantime = trantime - 1;
printf("trantime is %d \n", trantime);
if (c < bufsz)
{
for (retry = 0; retry < 10; ++retry)
{
_outbyte(EOT);
if ((c = _inbyte((DLY_1S) << 1)) == ACK)
break;
}
flushinput();
return (c == ACK) ? len : - 5;
}
if ((c = _inbyte(DLY_1S)) >= 0 && trantime == 0)
{
++packetno;
return ;
}
else
{
switch (c)
{
case ACK;
++packetno;
len += bufsz;
goto start;
default:
break;
}
}
}
}
void main()
{
int iRetVal;
int iSvcPort;
udp_Socket socket;
struct RunTimeContext runtime;
struct RunTimeContext *pRunTime;
char buffer[518];
serDopen(DPORTSPEED);
memset(tempbuf, 0, 512);
sock_init();
ifconfig
(
IF_ETHO,
IFS_DOWN,
IFS_IPADDR,
aton("192.168.1.3"),
IFS_NETMASK,
OxFFFFFF00uL,
IFS_ROUTER_SET,
aton("192.168.1.1"),
IFS_UP, IFS_END
);
pRunTime = &runtime;
pRunTime->m_pSocket = &socket;
pRunTime->m_dwTimeOut = 10L;
iSvcPort = 69;
if (!udp_open(pRunTime->m_pSocket, iSvcPort, 0, 0, NULL))
{
printf("Can not setup the tftp service udp_open!\n");
exit(0);
}
while (1)
{
tcp_tick(pRunTime->m_pSocket);
packetno = 1;
iRetVal = udp_recv(pRunTime->m_pSocket, pRunTime->m_pBuffer,
sizeof(pRunTime->m_pBuffer));
if (iRetVal >= 2)
{
switch (pRunTime->m_pBuffer[1])
{
case 2:
{
printf("Write request received for file'%s' \n",
pRunTime->m_pBuffer + 2);
ProcessWriteReq(pRunTime);
}
break;
case 4:
{
printf("ACK <%d> was received (error)\n", pRunTime
->m_pBuffer[3] + (256 *pRunTime->m_pBuffer[2]));
}
break;
default:
{
printf("Bad opcode was received:%d\n", pRunTime
->m_pBuffer[1]);
SendErrorMsg(pRunTime, ERR_ILLEGAL,
"opcode was not RRQ or WRQ");
}
break;
}
sock_close(pRunTime->m_pSocket);
udp_open(pRunTime->m_pSocket, iSvcPort, 0, 0, NULL);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -