打印

uip主动发数据问题

[复制链接]
7439|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happyming0809|  楼主 | 2012-5-4 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在的问题是,客户端向该服务器端发送一个数据包之后(连接已建立),服务器端在UIP_APPCALL宏定义中调用uip_send()返回一包数据很容易,但是,现在客户端并没有新的数据发过来的情况下,在某一时刻,希望服务器端主动向某一已建立连接的指定IP的客户端发送一个数据包,请问这是否可以实现,以及该如何处理?还劳烦各位大侠不吝赐教,尽可能说详细一点。最简单就是说。我收到串口的数据就要马上发数据到网络

相关帖子

沙发
happyming0809|  楼主 | 2012-5-4 16:21 | 只看该作者
void SockTCP_Send(const void  *dat,uint8_t len)                  //自己加的tcp主动发送函数。
{                                            

        //UIP_ESTABLISHED
//        uint8_t eth[14]={0xF4,0x6D,0x04 ,0xED ,0x25 ,0x5C ,0x00 ,0x0B ,0x3C ,0x23 ,0x34 ,0x2C ,0x08 ,0x00};
        uint8_t c,i;
        uint32_t sember;
        for(c = 0;c < UIP_CONNS;c ++)
        {

                if(uip_conns[c].tcpstateflags == UIP_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] = (uint8_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;
                    uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
                           uip_ipaddr_copy(BUF->destipaddr, uip_conns[c].ripaddr);  //记录数据
                      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());
            //        UIP_STAT(++uip_stat.tcp.sent);

                       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_STAT(++uip_stat.ip.sent);

                   //        uip_flags = 0;

                        uip_arp_out();
                    network_device_send();
                         
                //        free(uip_buf);
                }
                               
        }
       
       
}

使用特权

评论回复
板凳
happyming0809|  楼主 | 2012-5-4 16:22 | 只看该作者
上面的是我写的。可以主动发数据。
但是有个问题就是万一卡死之后。客户端就连不上了。
我用电脑的网络调试模块

使用特权

评论回复
地板
maxiang615| | 2012-9-5 11:35 | 只看该作者
楼主你好,你的问题解决了么?
把你的程序发给我一份我学习吧,现在正搞这一块,头大了  邮箱maxiang615@163.com  谢谢

使用特权

评论回复
5
maxiang615| | 2012-9-5 11:36 | 只看该作者
楼主你好,你的问题解决了么?
把你的程序发给我一份我学习吧,现在正搞这一块,头大了  邮箱maxiang615@163.com  谢谢

使用特权

评论回复
6
Colorbar| | 2013-4-26 22:13 | 只看该作者
547166217@qq.com,我也要一份

使用特权

评论回复
7
kaly_liu| | 2013-4-28 09:42 | 只看该作者
happyming0809 发表于 2012-5-4 16:21
void SockTCP_Send(const void  *dat,uint8_t len)                  //自己加的tcp主动发送函数。
{                                            

不知道您可否看到我的回复啊,现在我在用uip做TCP服务器,利用ack顺带数据,可以实现TCP服务器在接收到数据后,向客户端发送数据。但是无法实现主动发送。
我用了您的建议,我发现只有在 TCP客户端连接上的2秒内,才可以发送数据出去,而且只能发送一次,不知道是不是我的程序有问题啊····球高人解答下。
我实在main函数里面while(1)里面加的:
   if(sendtotcpflag>3)
    {
      SockTCP_Send(&temp[0],rxnum);
        sendtotcpflag=0;  
        memset(&temp[0],0,64);
        rxnum=0;
    }

而您的发送函数,我把它定义在uip.c文件里了。

使用特权

评论回复
8
kaly_liu| | 2013-5-2 15:09 | 只看该作者
没有人回答啊·····:'(

使用特权

评论回复
9
lskam| | 2013-9-4 09:09 | 只看该作者
楼主你好,跪求你的程序一份、、希望资源共享。现在我是搞通讯这一块的,。刚开始,。   lskam@163.com

使用特权

评论回复
10
wangfei717| | 2013-11-18 21:48 | 只看该作者
求代码,谢谢楼主!!!393779481@qq.com

使用特权

评论回复
11
jansion1| | 2015-6-30 18:18 | 只看该作者
kaly_liu 发表于 2013-4-28 09:42
不知道您可否看到我的回复啊,现在我在用uip做TCP服务器,利用ack顺带数据,可以实现TCP服务器在接收到数 ...

您好 你的问题解决了吗? 我也遇到类似问题。我的开发板作为tcp client  我主动发送数据的方式是这样的:
void send_datatotcpserver(char *buf, int len)
{
uip_send(buf, len)
uip_poll_request(当前的连接结构体);
uip_arp_out();
MT_dev_send()//最底层发送函数。



}
这样发送数据,偶尔会等待2秒才能把数据发送到服务器。
请问这2s怎么产生的? 我的程序send_datatotcpserver(char *buf, int len)很快就返回了, 那里来的2s呢

使用特权

评论回复
12
jf7686| | 2016-1-19 15:06 | 只看该作者
happyming0809 发表于 2012-5-4 16:21
void SockTCP_Send(const void  *dat,uint8_t len)                  //自己加的tcp主动发送函数。
{                                            

请问大大能分享一下code嘛?

使用特权

评论回复
13
FizeLin| | 2019-1-3 14:30 | 只看该作者
顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

237

帖子

1

粉丝