中级会员
 
- 积分
- 254
- 金钱
- 254
- 注册时间
- 2019-4-9
- 在线时间
- 79 小时
|
5金钱
程序是服务端,用的RAW的
#include "lwip_tcp_demo.h"
#include "lwip_comm.h"
#include "lwip/tcp.h"
#include "delay.h"
#include "mysys.h"
#include "LED.h"
#include <string.h>
/u8 tcp_sta = 0; //0表示 tcp 未连接 1: 表示tcp已成功连接
//u8 tcp_tx_sta = 0; //0表示 没有数据要发送 1: 表示有数据要发送
u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE];
//u8 tcp_server_sendbuf[] = "ENC28J60 TCP Client send data.\r\n";
err_t tcp_server_connected(void *arg, struct tcp_pcb *tpcb, err_t err);
err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err);
err_t tcp_server_accept(void *arg,struct tcp_pcb *newpcb,err_t err);
void tcp_server_err(void *arg, err_t err);
void tcp_send_pbuf_data_out(struct tcp_pcb *pcb, struct pbuf *p);
err_t tcp_server_sent(void *arg, struct tcp_pcb *tpcb,u16_t len);
err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb);
//void tcp_server_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct * es);
void tcp_server_test(void)
{
struct tcp_pcb *tcppcb;
//struct ip_addr localipaddr;
err_t err;
// u32 t = 0;
tcppcb = (struct tcp_pcb *)tcp_new(); //创建一个新的TCP PCB
if(tcppcb != NULL)
{
//IP4_ADDR(&localipaddr,lwipidev.ip[0],lwipidev.ip[1],lwipidev.ip[2],lwipidev.ip[3]);
err = tcp_bind(tcppcb, IP_ADDR_ANY, TCP_SERVER_PORT); //绑定一个本地IP地址和端口号
if(err == ERR_OK) //绑定成功
{
tcppcb = tcp_listen(tcppcb); //进入监听状态
tcp_accept(tcppcb, tcp_server_accept);//指定监听状态的连接联通之后将要调用的回调函数
}
}
while(1) //tcp 连接成功
{
INTX_DISABLE();
lwip_periodic_handle();
INTX_ENABLE();
if(tcp_server_recvbuf[0] == '!')
LED0 =1;
else if(tcp_server_recvbuf[0] == '#')
LED0 = 0;
}
}
//lwip TCP连接建立后调用回调函数
err_t tcp_server_accept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
printf("New Client connect\r\n");
tcp_recv(newpcb,tcp_server_recv);
return ERR_OK;
}
//lwip tcp_recv()接收回调函数
err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err)
{
struct pbuf *q;
u32 data_len = 0; //记录接收buff已使用空间大小
if(p != NULL)
{
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE); //将接收的buff清0
for(q = p; q != NULL; q=q->next) //存储接收到的数据
{
if(q->len > (TCP_SERVER_RX_BUFSIZE - data_len)) //若该“pbuf中的数据” 大于 “接收缓存剩余可用空间”
memcpy(tcp_server_recvbuf+data_len,q->payload,(TCP_SERVER_RX_BUFSIZE-data_len)); //则只拷贝可用空间大小的数据
else
memcpy(tcp_server_recvbuf+data_len,q->payload,q->len); //可用空间大小 大于该pbuf中的payload段数据,则全部拷贝
data_len += q->len; //更新接收buff已使用空间
if(data_len > TCP_SERVER_RX_BUFSIZE) break;
}
tcp_recved(tpcb,p->tot_len);
tcp_write(tpcb,p->payload,p->len,1); //回显操作
printf("%s",&tcp_server_recvbuf[0]); //并向串口打印接收的信息
pbuf_free(p);
}
else if(err == ERR_OK) //客户端断开连接
{
printf("Client closed Connection\r\n");
return tcp_close(tpcb);
}
return ERR_OK;
}
/*
void tcp_send_pbuf_data_out(struct tcp_pcb *pcb, struct pbuf *p)
{
if(NULL == pcb || NULL == p)
{
return;
}
while(p != NULL)
{
tcp_write(pcb,p->payload,p->len,1);
p = p->next;
}
}
*/
//lwip tcp进程出现错误时回调函数
void tcp_server_err(void *arg, err_t err)
{
printf("fatal error has occurred.\r\n");
if(ERR_RST != err)
tcp_server_test();
}
|
|