LWIP下,给tcp_connect成功后的回调函数传递参数

先上结论,通过tcp_arg()函数为tcp_connect()中的callback传递参数。

/* Demo */
···
void client_build()
{
	struct tcp_pcb *tcp_client_pcb = NULL;
	ip_addr_t ipaddr;
	IP4_ADDR(&ipaddr, 127, 0, 0, 1);
	tcp_client_pcb = tcp_new();
	tcp_bind(tcp_client_pcb, IP_ADDR_ANY, server_port);
	err_t err;
	char* str = "this is a test message";
	tcp_arg(tcp_client_pcb , test_arg );
	tcp_connect(tcp_client_pcb , client_addr, server_port, connectsuccess);
	ip_set_option(looper->client_pcb, SOF_KEEPALIVE);
	tcp_err(looper->client_pcb, client_connecterror);
}
void connectsuccess(void *arg, struct tcp_pcb *tpcb, err_t err)
{
	printf(" client connect successful, %s \r\n", arg);
}

tcp_arg()原型如下, 将参数交给clientpcbcallback_arg

void
tcp_arg(struct tcp_pcb *pcb, void *arg)
{
  LWIP_ASSERT_CORE_LOCKED();
  /* This function is allowed to be called for both listen pcbs and
     connection pcbs. */
  if (pcb != NULL) {
    pcb->callback_arg = arg;
  }
}

tcp_connect的调用过程

err_t
tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
            tcp_connected_fn connected)
{
	···
	pcb->connected = connected;
	···
}
#define TCP_EVENT_CONNECTED(pcb,err,ret)                         \
  do {                                                           \
    if((pcb)->connected != NULL)                                 \
      (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \
    else (ret) = ERR_OK;                                         \
  } while (0)
static err_t
tcp_process(struct tcp_pcb *pcb)
{
	···
	switch (pcb->state) {
    	case SYN_SENT:
    		···
    		 if ((flags & TCP_ACK) && (flags & TCP_SYN)
          && (ackno == pcb->lastack + 1)) {
          		···
				TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
				···
				}
			···
			}
	}
	···
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值