netconn_accept(代码较长,这里不进行粘贴)用于TCP服务器中,等待着远端主机的连接请求,并且建立一个新的TCP连接,在调用这个函数之前需要通过调用 listen()函数让服务器进入监听状态。accept()函数的调用会阻塞应用线程直至与远程主机建立TCP连接。参数addr是一个返回结果参数,它的值由accept()函数设置,其实就是远程主机的地址与端口号等信息,当新的连接已经建立后,远端主机的信息将保存在连接句柄中,能够标识连接对象。
了解了以上3个API,我们开始创建Server工程:
static void server(void* thread_param)
{
struct netconn* conn, *newconn;
err_t err;
LWIP_UNUSED_ARG(arg);
#if LWIP_IPV6
conn = netconn_new(NETCONN_TCP_IPV6);
netconn_bind(conn, IP6_ADDR_ANY, LOCAL_PORT);
#else /* LWIP_IPV6 */
conn = netconn_new(NETCONN_TCP); //①
netconn_bind(conn, IP_ADDR_ANY, LOCAL_PORT); //②
#endif /* LWIP_IPV6 */
LWIP_ERROR("tcpecho: invalid conn", (conn != NULL), return;);
printf("The local port number is%d\n\n", LOCAL_PORT);
netconn_listen(conn); //③
while (1) {
err = netconn_accept(conn, &newconn); //④
if (err == ERR_OK) {
struct netbuf* buf;
void* data;
u16_t len;
while ((err = netconn_recv(newconn, &buf)) == ERR_OK) { //⑤
do {
netbuf_data(buf, &data, &len);
err = netconn_write(newconn, data, len, NETCONN_COPY); //⑥
} while (netbuf_next(buf) >= 0);
netbuf_delete(buf); //⑦
}
netconn_close(newconn); //⑧
netconn_delete(newconn); //⑨
}
}
}1 申请一个连接结构,指定参数是NETCONN_TCP,即TCP连接
2 绑定本地的IP地址与端口号
3 使TCP服务器进入监听状态
4 处理客户端的连接请求,当只有当有客户端发送连接请求的时候才会处理,否则将进入阻塞态,而客户端的信息保存在newconn连接结构中
5 接收数据,并装填进buf
6 对接收的数据进行转发(指定为不拷贝方式NETCONN_COPY)
7 释放数据空间
8 主动关闭客户端的连接
9 释放newconn空间
到这里已经完成了工程的创建,看一下PC的IP地址,设备需要处于同一网段,以方便测试。
|