RT_thread 学习笔记2——TCP/IP协议栈(LwIP)

 netconn write() 原型声明 
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值