18602141485 发表于 2014-1-11 13:40:09

uip主动发送问题

我的uip能够建立主动连接,现在不知道怎么发送数据,哪位大神指导一下?
voiduip_senddata(uint8_t data[],int data_len){
   uip_ipaddr_t ipaddr;
struct uip_conn *u;

uip_ipaddr(ipaddr, 192,168,1,133); // 目的地址

u= uip_connect(&ipaddr, htons(4001));
if(u==NULL)
{
//这里要做错误处理。               
return ;
}
uip_periodic_conn(u);
if(uip_len== 0)
{
      uip_periodic_conn(u);//由于在uip_connect时conn->timer = 1,"
                        //"所以必须调用uip_periodic_conn两次uip才会准备数据"
}

uip_send(data,data_len);
}

在我的主动发送的appcall中只能发出如果建立连接的测试。

armstrong 发表于 2014-1-12 21:09:54

uip的主循环模型在文档中有示例,这个不要改变它;因为模型是一个项目固有的,改变它你会碰很多钉子。
要主动发送,就要通过回调的形式实现,让uip调用你。
我贴段我现成的代码给你,放在uip的主循环中,你自己看看我的意图,领会了就行。
while(1){
    ...;
   
    // 查询是否有主动发送请求挂起。
    pmsg = enet_deq();
    while(pmsg){
      ipaddr = SWAP32(pmsg->hostaddr);
      uip_ipaddr_copy(_udp_conn.ripaddr, &ipaddr);
      _udp_conn.rport = htons(pmsg->hostport);
      _udp_conn.lport = HTONS(AGENT_WORK_PORT);
      _udp_conn.ttl = UIP_TTL;
      uip_udp_conn = &_udp_conn;
      uip_sappdata = uip_appdata = &uip_buf;
      uip_send(pmsg->data, pmsg->datalen);
      uip_process(UIP_UDP_SEND_CONN);   /* 这是主动发送的关键 */
      if(linkup && (uip_len > 0)){
      uip_arp_out();
      mac_write_packet(uip_buf, uip_len);
      }
      uip_len = 0;
      // 释放消息报文的堆内存。
      free(pmsg);
      pmsg = enet_deq();
    }
            
    ...;
}

18602141485 发表于 2014-1-12 23:47:57

armstrong 发表于 2014-1-12 21:09
uip的主循环模型在文档中有示例,这个不要改变它;因为模型是一个项目固有的,改变它你会碰很多钉子。
要主 ...

我需要怎么回调啊?我是一个初学者,你那有没有整个工程的代码啊关于uip主动发送的?可以让我看看么?280281229@qq.com

armstrong 发表于 2014-1-13 08:56:13

      
下面这段是重点,你应该看出来的。
      uip_udp_conn = &_udp_conn;
      uip_sappdata = uip_appdata = &uip_buf;
      uip_send(pmsg->data, pmsg->datalen);
      uip_process(UIP_UDP_SEND_CONN);   /* 这是主动发送的关键 */
      if(linkup && (uip_len > 0)){
      uip_arp_out();
      mac_write_packet(uip_buf, uip_len);
      }
      uip_len = 0;

18602141485 发表于 2014-1-13 09:32:46

armstrong 发表于 2014-1-13 08:56
下面这段是重点,你应该看出来的。
      uip_udp_conn = &_udp_conn;
      uip_sappdata = uip_ap ...

这段是受到消息后,将连接复制下来,然后发送数据。

armstrong 发表于 2014-1-13 09:40:13

对!这就是主动发送的基本思想;uip_process会负责把你的数据封装成IP报文,uip_arp_out会负责给你的报文添加MAC地址,mac_write_packet负责把你的报文丢给网卡。

18602141485 发表于 2014-1-13 09:40:24

armstrong 发表于 2014-1-13 08:56
下面这段是重点,你应该看出来的。
      uip_udp_conn = &_udp_conn;
      uip_sappdata = uip_ap ...

您方便么?可不可以和你用qq聊下呢?我的qq280281229

18602141485 发表于 2014-1-13 09:41:44

armstrong 发表于 2014-1-13 09:40
对!这就是主动发送的基本思想;uip_process会负责把你的数据封装成IP报文,uip_arp_out会负责给你的报文添 ...

我再uip1.0里边没找到enet_deq()这个函数啊。

armstrong 发表于 2014-1-13 09:47:47

有了这个主动发送的前奏,后续的事情你就应该响应UIP_APPCALL宏所定义的函数了,这里会以事件的模型触发tcpip事件,如数据到达,应答发送完成,连接关闭,等等。

armstrong 发表于 2014-1-13 09:52:50

enet_deq是我自己的函数,它负责从队列中取出别人投递的要发送的数据,如果有数据,就返回数据包指针;否则返回NULL;取出的数据用过之后,用free释放内存,再循环检查有没有投递的数据;接着。。。

armstrong 发表于 2014-1-13 09:53:40

所以enet_deq函数并不重要,你应该有自己的实现。

18602141485 发表于 2014-1-13 10:05:06

armstrong 发表于 2014-1-13 09:53
所以enet_deq函数并不重要,你应该有自己的实现。

恩恩,谢谢了,   你还是把代码发我邮箱,我研究下代码吧,这样也不耽搁你时间了。我看uip时间不长,很多不知道怎么调用。
页: [1]
查看完整版本: uip主动发送问题