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中只能发出如果建立连接的测试。
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();
}
...;
} armstrong 发表于 2014-1-12 21:09
uip的主循环模型在文档中有示例,这个不要改变它;因为模型是一个项目固有的,改变它你会碰很多钉子。
要主 ...
我需要怎么回调啊?我是一个初学者,你那有没有整个工程的代码啊关于uip主动发送的?可以让我看看么?280281229@qq.com
下面这段是重点,你应该看出来的。
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; armstrong 发表于 2014-1-13 08:56
下面这段是重点,你应该看出来的。
uip_udp_conn = &_udp_conn;
uip_sappdata = uip_ap ...
这段是受到消息后,将连接复制下来,然后发送数据。 对!这就是主动发送的基本思想;uip_process会负责把你的数据封装成IP报文,uip_arp_out会负责给你的报文添加MAC地址,mac_write_packet负责把你的报文丢给网卡。 armstrong 发表于 2014-1-13 08:56
下面这段是重点,你应该看出来的。
uip_udp_conn = &_udp_conn;
uip_sappdata = uip_ap ...
您方便么?可不可以和你用qq聊下呢?我的qq280281229 armstrong 发表于 2014-1-13 09:40
对!这就是主动发送的基本思想;uip_process会负责把你的数据封装成IP报文,uip_arp_out会负责给你的报文添 ...
我再uip1.0里边没找到enet_deq()这个函数啊。 有了这个主动发送的前奏,后续的事情你就应该响应UIP_APPCALL宏所定义的函数了,这里会以事件的模型触发tcpip事件,如数据到达,应答发送完成,连接关闭,等等。 enet_deq是我自己的函数,它负责从队列中取出别人投递的要发送的数据,如果有数据,就返回数据包指针;否则返回NULL;取出的数据用过之后,用free释放内存,再循环检查有没有投递的数据;接着。。。 所以enet_deq函数并不重要,你应该有自己的实现。 armstrong 发表于 2014-1-13 09:53
所以enet_deq函数并不重要,你应该有自己的实现。
恩恩,谢谢了, 你还是把代码发我邮箱,我研究下代码吧,这样也不耽搁你时间了。我看uip时间不长,很多不知道怎么调用。
页:
[1]