如果flags值为NETCONN NOCOPY,数据不会被复制而是直接使用data指针来引用。这些数据在 函数调用后不能被修改,因为这些数据可能会被放在当前指定连接的重发队列,并且会在里面逗 留一段不确定的时间。当要发送的数据在ROM中因而数据不可变时这很有用。
如果需要更多的控 制数据的修改,则可以联合使用复制和不复制数据,如下面的例子所示。
}
netconn send() 原型声明
int netconn send(struct netconn *conn, struct netbuf *buf)
使用参数conn指定的UDP连接发送参数buf中的数据。netbuf中的数据不能太大,因为没有使用IP分段。数据长度不能大于发送网络接口(outgoing network interface)的最大传输单元值(MTU)。因为目前还没有获取这个值的方法,这就需要采用其它的途径来避免超过MTU值,所以规定了一个上限,就是netbuf中包含的数据不能大于1000个字节。函数对要发送的数据大小没有进行校验,无论是非常小还是非常大,因而函数的执行结果是不确定的。
例子:这个例子显示了如何向 IP 地址为 10.0.0.1,UDP 端口号为 7000 的远程主机发送 UDP 数据。
void lw thread(void* parameter)
{
struct netconn *conn;
struct netbuf *buf;
struct ip addr addr;
char *data;
char text[] = "A static text";
int i;
/* 建立一个新的连接 */
conn = netconn new(NETCONN UDP);
/* 设置远程主机的IP地址,执行这个操作后,addr.addr的值为0x0100000a */
addr.addr = htonl(0x0a000001);
/* 连接远程主机 */
netconn connect(conn, &addr, 7000);
/* 建立一个新的netbuf */
buf = netbuf new();
data = netbuf alloc(buf, 10);
/* 构造一些测试数据 */
for(i = 0; i < 10; i++)
data[i]= i;
/* 发送构造的数据 */
netconn send(conn, buf);
/* 引用这个文本给netbuf */
netbuf ref(buf, text, sizeof(text));
/* 发送文本 */
netconn send(conn, buf);
/* 删除conn和buf */
netconn delete(conn);
netconn delete(buf);
}
BSD Socket是在Unix下进行网络通信编程的API接口之一,也是网络编程的事实标准。
LwIP有自己实现的 API,还提供了一个轻型BSD Socket API的实现,为大量已有的网络应用程序提供了兼容的接口,上面 netconn write()和netconn send()是LwIP自己实现的 API。LwIP的socket接口实现都在函数名前加有lwip 前缀,同时在头文件中把它采用宏定义的方式定义成标准的BSD Socket API接口。
如:分配一个socket
int lwip socket(int domain, int type, int protocol);
int socket(int domain, int type, int protocol);