tcp_setprio
时间: 2023-08-07 10:11:57 浏览: 245
tcp_setprio()函数的作用是设置TCP连接的优先级。它的原型定义如下:
```c
void tcp_setprio(struct tcp_pcb *pcb, u8_t prio);
```
其中,参数pcb是指向TCP控制块(pcb)的指针,参数prio是要设置的优先级。
TCP连接的优先级用于控制TCP数据包的发送顺序和重传机制。较高的优先级将使TCP数据包更快地发送和重传,但也可能会导致网络拥塞和丢包。因此,我们需要根据实际情况来确定TCP连接的优先级。
在tcp_setprio()函数中,它会将参数prio设置到TCP控制块的优先级字段中,如下所示:
```c
void
tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
{
LWIP_ASSERT("tcp_setprio: invalid pcb", pcb != NULL);
pcb->prio = prio;
}
```
函数开头进行了参数的检查,然后将优先级prio设置到TCP控制块的prio字段中。
需要注意的是,TCP连接的优先级并不是通过tcp_setprio()函数来设置的,而是在创建TCP连接时通过tcp_new()函数的参数设置的。tcp_setprio()函数的作用是在TCP连接创建后更改连接的优先级。
总之,tcp_setprio()函数是lwIP中用于设置TCP连接优先级的函数。
相关问题
tcp_setprio()函数的优先级一般设置为多少
TCP连接的优先级是根据具体应用场景和实际网络情况来确定的,一般情况下,建议将TCP连接的优先级设置为默认值,即0。这是因为,在没有特殊需求的情况下,将优先级设置过高可能会导致网络拥塞和丢包。
如果确实需要设置TCP连接的优先级,可以根据应用的具体情况进行调整。例如,在对实时性要求较高的应用中,可以适当提高TCP连接的优先级;而在对可靠性要求较高的应用中,可以适当降低TCP连接的优先级。
需要注意的是,TCP连接的优先级不是唯一的影响因素,还受到网络拥堵、带宽限制、数据包重传等因素的影响。因此,在设置TCP连接的优先级时,需要结合实际情况进行综合考虑。
lwip 实现tcp服务端 需要代码
以下是一个基本的 LWIP TCP 服务器代码示例:
```c
#include "lwip/sys.h"
#include "lwip/netif.h"
#include "lwip/tcp.h"
#include "netif/etharp.h"
#define TCP_PORT 5005
static struct tcp_pcb *tcp_server_pcb;
err_t tcp_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{
LWIP_UNUSED_ARG(arg);
LWIP_UNUSED_ARG(err);
tcp_setprio(newpcb, TCP_PRIO_MIN);
/* Set up the various callback functions */
tcp_recv(newpcb, tcp_server_recv);
tcp_err(newpcb, tcp_server_error);
tcp_poll(newpcb, tcp_server_poll, 4);
return ERR_OK;
}
err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
LWIP_UNUSED_ARG(arg);
if (p == NULL)
{
tcp_server_connection_close(tpcb);
}
else
{
tcp_recved(tpcb, p->tot_len);
pbuf_free(p);
}
return ERR_OK;
}
err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb)
{
LWIP_UNUSED_ARG(arg);
if (tpcb->state == ESTABLISHED)
{
/*send some data*/
tcp_write(tpcb, "Hello, World!", 13, 1);
}
else
{
tcp_server_connection_close(tpcb);
}
return ERR_OK;
}
void tcp_server_error(void *arg, err_t err)
{
LWIP_UNUSED_ARG(arg);
LWIP_UNUSED_ARG(err);
}
void tcp_server_connection_close(struct tcp_pcb *tpcb)
{
/* close tcp connection */
tcp_arg(tpcb, NULL);
tcp_sent(tpcb, NULL);
tcp_recv(tpcb, NULL);
tcp_err(tpcb, NULL);
tcp_poll(tpcb, NULL, 0);
tcp_close(tpcb);
}
void tcp_server_init(void)
{
struct tcp_pcb *pcb;
pcb = tcp_new();
tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT);
pcb = tcp_listen(pcb);
tcp_accept(pcb, tcp_server_accept);
tcp_server_pcb = pcb;
}
int main(void)
{
sys_init();
netif_init();
tcp_server_init();
while (1)
{
sys_check_timeouts();
}
return 0;
}
```
这个代码示例启动了一个 TCP 服务器,它监听在 5005 端口上。当一个连接被接受后,它会发送 "Hello, World!" 消息,并在每个 4 秒内轮询该连接。如果连接已经断开,就会关闭该连接。
你需要在你的应用程序中实现 `sys_init()` 和 `sys_check_timeouts()` 函数,这些函数将 LWIP 的系统定时器与你的应用程序的定时器集成。你还需要在你的应用程序中实现 `netif_init()` 函数,它将初始化网络接口。
阅读全文