我已经采用了一个项目LwIP_HTTP_Server_Netconn_RTOS(STM32CubeMX)并更改了TCP服务器代码,如下所示。但在客户端,我得到这样的结果:
S:SET / 数字:1 数字:6 数字:6 数字:6 数字:6 数字:7 数字:7
我做错了什么?
void http_server_serve(struct netconn *conn)
{
struct netbuf *inbuf;
char* buf;
u16_t buflen;
size_t len;
unsigned int call_times = 0;
#define SIZE_ARRAY 21
char data[SIZE_ARRAY]={0};
while(netconn_recv(conn, &inbuf) == ERR_OK)
{
netbuf_data(inbuf, (void**)&buf, &buflen);
if ((buflen >=5) && (strncmp(buf, "SET /", 5) == 0))
{
for(int i=0;i<7;i++)
{
if(conn->state == NETCONN_NONE)
{
sprintf(data, " Num: %d\n", ++call_times);
len = strlen(data);
printf(" Num: %d\n", call_times);
netconn_write(conn, (const unsigned char*)(data), (size_t)len, NETCONN_NOFLAG);
}
}
netbuf_delete(inbuf);
}
}
netconn_close(conn);
netbuf_delete(inbuf);
}
答案 0 :(得分:1)
请参阅lwIP关于netconn_write()
的非官方wiki:
http://lwip.wikia.com/wiki/Netconn_write
err_t netconn_write ( struct netconn * aNetConn, const void * aData, size_t aSize, u8_t aApiFlags );
[...]
aApiFlags:
之一
- NETCONN_NOCOPY,如果数据稳定的话 传输时间(静态数据或堆)
- NETCONN_COPY如果 数据在传输时(堆栈)不稳定
然后你的第一个错误是通过NETCONN_NOFLAG
,这是不允许的。最有可能NETCONN_NOFLAG
在数值上等于NETCONN_NOCOPY
。在这种情况下,lwIP将直接从您的缓冲区发送数据,但这将在后台&#34;中完成。当netconn_write(..., NETCONN_NOCOPY)
返回时,您必须 NOT 修改您传递的缓冲区,直到传输完成。因为您在正在进行的传输过程中对其进行修改,所以在接收方会得到错误的结果。
在你的情况下,很难得到传输完成的信息 - 这只能通过回调来完成。即使你这样做,这也不会给你任何好处,因为你必须等待传输完成&#34;事件无论如何。所以这里最好的选择就是使用NETCONN_COPY
。