int netconn write(struct netconn *conn, void *data, int len, unsigned int flags)
这个函数只用于TCP连接。 它把data指针指向的数据放在属于conn连接的输出队列。Len参数指 定数据的长度,这里对数据长度没有任何限制。这 个函数不需要应用程序明确的分配缓冲区 (buffers),因为这由协议栈来负责。 flags参数有两种可能的状态,如下所示:
#define NETCONN NOCOPY 0x00
#define NETCONN COPY 0x01
当flags值为 NETCONN COPY 时,data指针指向的数据被复制到为这些数据分配的内部缓冲区。 这就允许这些数据在函数调用后可以直接修改, 但是这会在执行时间和内存使用率方面降低效率。
如果flags值为NETCONN NOCOPY,数据不会被复制而是直接使用data指针来引用。这些数据在 函数调用后不能被修改,因为这些数据可能会被放在当前指定连接的重发队列,并且会在里面逗 留一段不确定的时间。当要发送的数据在ROM中因而数据不可变时这很有用。
如果需要更多的控 制数据的修改,则可以联合使用复制和不复制数据,如下面的例子所示。
这个例子显示了netconn write() 函数的基本用法。这里假定程序里的data 变量在后面编辑修改,因此它被复制到内部缓冲区,方法是前文所讲的在调用netconn write() 函数时将flags 参数值设 为NETCONN COPY。text 变量包含了一个不能被编辑修改的字符串,因此它采用指针引用的方式以代替复制。
void lw thread (void* parameter)
{
struct netconn *conn;
char data[10];
char text[] = "Static text";
int i;
/* 设置连接conn */
/* [...] */
/* 构造一些测试数据 */
for(i = 0; i 10; i++)
data[i] = i;
netconn write(conn, data, 10, NETCONN COPY);
netconn write(conn, text, sizeof(text), NETCONN NOCOPY);
/* 这些数据可以被修改 */
for(i = 0; i 10; i++)
data[i] = 10 - i;
/* 关闭连接 */
netconn close(conn);
}
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);