一、完整代码
tcp_server.c
cpp
#include "tcp_server.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void Tcp_Server_Init(void)
{
struct tcp_pcb *tcp_server_pcb;
/* 为tcp服务器分配一个tcp_pcb结构体 */
tcp_server_pcb = tcp_new();
/* 绑定本地端号和IP地址 */
tcp_bind(tcp_server_pcb, IP_ADDR_ANY, 8080);
/* 监听之前创建的结构体tcp_server_pcb */
tcp_server_pcb = tcp_listen(tcp_server_pcb);
/* 初始化结构体接收回调函数 */
tcp_accept(tcp_server_pcb, tcp_server_accept);
}
static err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
/* 配置接收回调函数 */
tcp_recv(pcb, tcp_server_recv);
return ERR_OK;
}
static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)
{
struct pbuf *tcp_send_pbuf;
if (tcp_recv_pbuf != NULL)
{
/* 扩大收发数据的窗口 */
tcp_recved(pcb, tcp_recv_pbuf->tot_len);
/* 将接收的数据拷贝给发送结构体 */
tcp_send_pbuf = tcp_recv_pbuf;
/* 将接收到的数据再转发出去 */
tcp_write(pcb, tcp_send_pbuf->payload, tcp_send_pbuf->len, 1);
pbuf_free(tcp_recv_pbuf);
}
return ERR_OK;
}
tcp_server.h
cpp
#ifndef __TCP_SERVER_H
#define __TCP_SERVER_H
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/tcp.h"
#include "lwip/memp.h"
#include "lwip/mem.h"
#include "lwip_comm.h"
void Tcp_Server_Init(void);
static err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb, err_t err);
static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err);
#endif
二、注意事项
运行一个之前已经成功的客户端代码时,如果出现设备从客户端到服务器的转变,他们会出现长时间的ping不通的情况,那么就再次执行一次下面改变主机的步骤,然后按一下复位,再次运行,就可以正常通信。