jerkoh 发表于 2013-3-10 21:18
dirtwillfly版主的方法: 用软件虚造一个查询信号,就主动发送了
这是个好的办法。
我也测试过。
我在网上查了,说是UIP可以实现TCP服务器的主动发送的,只需要重组包什么的,有人这么弄的,但是不知道如何实现,我试了下,好像不行···不知道高手可否赐教。
void SockTCP_Send(const void *dat,u8_t len) //自己加的tcp主动发送函数。
{
u8_t c,i;
u32_t sember;
for(c = 0;c < UIP_CONNS;c ++)
{
if(uip_conns[c].tcpstateflags == ESTABLISHED)
{
BUF->ackno[0] = uip_conns[c].rcv_nxt[0];
BUF->ackno[1] = uip_conns[c].rcv_nxt[1];
BUF->ackno[2] = uip_conns[c].rcv_nxt[2];
BUF->ackno[3] = uip_conns[c].rcv_nxt[3];
BUF->seqno[0] = uip_conns[c].snd_nxt[0];
BUF->seqno[1] = uip_conns[c].snd_nxt[1];
BUF->seqno[2] = uip_conns[c].snd_nxt[2];
BUF->seqno[3] = uip_conns[c].snd_nxt[3]; //低位
sember = (uip_conns[c].snd_nxt[0] << 24) + (uip_conns[c].snd_nxt[1] << 16) +
(uip_conns[c].snd_nxt[2] <<8) + uip_conns[c].snd_nxt[3];
sember += len;
if(sember == 0xfffffff0)
sember = 0x001;
for(i = 0;i < 4;i ++)
{
uip_conns[c].snd_nxt[3-i] = (u8_t)(sember & 0x00ff);
sember = (sember >> 8);
}
BUF->proto = UIP_PROTO_TCP;
BUF->srcport = uip_conns[c].lport;
BUF->destport = uip_conns[c].rport; //端口
BUF->flags = 0x18;
BUF->tcpoffset = 0x50;
BUF->srcipaddr[0] = uip_hostaddr[0];
BUF->srcipaddr[1] = uip_hostaddr[1];
BUF->destipaddr[0] = uip_conn->ripaddr[0];
BUF->destipaddr[1] = uip_conn->ripaddr[1];
BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8);
BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff);
BUF->ttl = UIP_TTL;
uip_len = 40 + len;
memcpy(uip_buf + 54,(dat),len);
BUF->len[0] = (uip_len >> 8);
BUF->len[1] = (uip_len & 0xff);
BUF->urgp[0] = BUF->urgp[1] = 0;
BUF->tcpchksum = 0;
BUF->tcpchksum = ~(uip_tcpchksum());
BUF->vhl = 0x45; //我们一般用的都是ipv4协议
BUF->tos = 0;
BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
++ipid;
BUF->ipid[0] = ipid >> 8;
BUF->ipid[1] = ipid & 0xff;
BUF->ipchksum = 0;
BUF->ipchksum = ~(uip_ipchksum());
uip_arp_out();
network_device_send();
}
}
}
|