您的位置:首页 > 其它

contiki udp 使用

2015-03-18 00:00 393 查看
摘要: contiki udp 的使用以及注意事项。

一、用到的函数。

获取连接函数 
struct uip_udp_conn * udp_new(const uip_ipaddr_t *ripaddr, uint16_t port, void *appstate)

参数: ripaddr -- 远端 ip
port -- 远端端口
appstate -- 连接过程中需要用到的数据,该数据会以event中的data传递。
返回值: uip_udp_conn -- udp的连接,但系统没有空闲的连接的时候,则返回NULL。

端口绑定宏
#define udp_bind(conn, port) uip_udp_bind(conn, port)
展开如下:
#define uip_udp_bind(conn, port) (conn)->lport = port

  作用是绑定连接的本地端口。

3. 数据发送函数

void uip_udp_packet_send(struct uip_udp_conn *c, const void *data, int len)

参数: c -- 使用udp_new分配的连接。
data -- 需要发送的数据。
len -- 需要发送的数据的长度。
返回值: void

二、udp server

#include "contiki.h"
#include "contiki-net.h"

struct uip_udp_conn *server_conn = NULL;
uint8_t buf[32];

#define UIP_IP_BUF   ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UIP_UDP_BUF  ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])

PROCESS(udp_server, "udp server");

PROCESS_THREAD(udp_server, ev, data)
{
int len;
PROCESS_BEGIN();

// 分配连接
// 分配连接的时候 server_conn 会记录当前的进程,以便有事件产生的时候调用该进程。
// 如果下面的第二个参数不为0 (UIP_HTONS(0)),则该服务端只能接受到客户端的端口为该参数的数据。
server_conn = udp_new(NULL, UIP_HTONS(0), NULL);

// 设置监听端口
udp_bind(server_conn, UIP_HTONS(3030));
// 接收到数据
while (1) {
if (ev == tcpip_event) {
// udp_new 函数中的 appstate 会跟 ev 一起传进来
// 当接收到数据的时候 uip_newdata() > 0
if (uip_newdata()) {
// 收到的数据长度
len = uip_datalen();

7fe0
if (len > 32)
len = 32;
// 获取客户端发送的数据
memcpy(buf, uip_appdata, len);

// 获取客户端的端口和 IP
server_conn->rport = UIP_UDP_BUF->srcport;
uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);

uip_udp_packet_send(server_conn, buf, len);

// 发送数据后,如果不需要该客户端了,则需要释放该远程端口,不然会别的客户端不能连接上来
uip_create_unspecified(&server_conn->ripaddr);
server_conn->rport = 0;
}
}
}
PROCESS_END();
}


三、udp client

#include "contiki.h"
#include "contiki-net.h"

struct uip_udp_conn *client_conn = NULL;
uint8_t buf[32];

#define UIP_IP_BUF   ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UIP_UDP_BUF  ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])

PROCESS(udp_client, "udp client");

PROCESS_THREAD(udp_client, ev, data)
{
static uip_ipaddr_t ipaddr;      // 服务器地址
PROCESS_BEGIN();

uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
// 分配连接
// 设置服务器地址以及端口
client_conn = udp_new(&ipaddr, UIP_HTONS(3030), NULL);

// 如果server指定了客户端的端口,则需要调用下面函数
// udp_bind(client_conn, UIP_HTONS(3031));

buf[0] = 0x01
uip_udp_packet_send(client_conn, buf, 1);

// 当使用完该连接之后,则需要释放该连接,否则会导致conn分配完毕,不能再次分配
uip_udp_remove(client_conn);
PROCESS_END();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  contiki udp