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();
- }
- }
- }
|