RAW 编程接口 TCP 函数简介

这篇具有很好参考价值的文章主要介绍了RAW 编程接口 TCP 函数简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、LWIP 中 RAW API  编程接口中与 TCP  相关的函数

tcpip raw连接,LWIP,开发语言,服务器

二、LWIP TCP RAW API 函数

tcpip raw连接,LWIP,开发语言,服务器

三、LwIP_Periodic_Handle函数

LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供时间并查询链路状态,该 函数有一个形参,用于指示当前时间,单位为 ms。 对于 TCP功能,每 250ms执行一次 tcp_tmr函数;对于 ARP,每 5s 执 行一次 etharp_tmr函数;对于链路状态检测,每 1s 执行一次ETH_CheckLinkStatus 函数; 对于 DHCP功能,每 500ms执行一次 dhcp_fine_tmr函数,如果 DHCP处于DHCP_START 或 DHCP_WAIT_ADDRESS 状态就执行LwIP_DHCP_Process_Handle 函数,对于 DHCP功 能,还有每 60s 执行一次 dhcp_coarse_tmr函数。

四、TCP客户端连接代码

tcpclinet.c

#include "tcpclient.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>
#include <string.h>

static struct tcp_pcb *client_pcb = NULL;

static void client_err(void *arg, err_t err)
{
	tcp_close(client_pcb);//连接失败的时候释放TCP控制块的内存	
	TCP_Client_Init();//重新连接
}

static err_t client_send(void *arg, struct tcp_pcb *tpcb)
{
	unsigned char send_buf[]= "hello server\n";
	tcp_write(tpcb, send_buf, sizeof(send_buf), 1);//发送数据到服务器
	return ERR_OK;
}

static err_t client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
	if (p != NULL)
	{
		tcp_recved(tpcb, p->tot_len);/* 确认收到服务器发送的数据,更新窗口,服务器可以继续发送数据,否则重发数据 */
		tcp_write(tpcb, p->payload, p->tot_len, 1);/* 返回接收到的数据*/
		memset(p->payload, 0 , p->tot_len);
		pbuf_free(p);
	}
	else if (err == ERR_OK)
	{
		printf("server has been disconnected!\n");//服务器断开连接
		tcp_close(tpcb);
		TCP_Client_Init();//重新连接
	}
	return ERR_OK;
}

static err_t client_connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
	printf("connected ok!\n");
	tcp_poll(pcb,client_send,2);//注册一个周期性回调函数,每2*0.5秒调用一次client_send函数,0.5s是内核定时器的处理周期
	tcp_recv(pcb,client_recv);//注册一个接收函数
	return ERR_OK;
}

void TCP_Client_Init(void)
{
	ip_addr_t server_ip;
	client_pcb = tcp_new();/* 创建一个TCP控制块  */
	IP4_ADDR(&server_ip, 192,168,1,104);/*绑定服务器ip地址*/
	tcp_connect(client_pcb,&server_ip,8080,client_connected);//开始连接
	tcp_err(client_pcb, client_err);//注册异常处理
}

tcpclinet.h 

#ifndef _TCPCLIENT_H_
#define _TCPCLIENT_H_

void TCP_Client_Init(void);

#endif
 

五、TCP服务器连接代码

tcpserver.c

#include "tcpserver.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>
#include <string.h>

static err_t TcpServerRecv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
	if (p != NULL)
	{
		tcp_recved(tpcb, p->tot_len);/* 更新窗口*/
		tcp_write(tpcb, p->payload, p->tot_len, 1);/* 返回接收到的数据*/
		memset(p->payload, 0 , p->tot_len);
		pbuf_free(p);
	}
	else if (err == ERR_OK)
	{
		return tcp_close(tpcb);
	}
	return ERR_OK;
}
static err_t TcpServerAccept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
	tcp_recv(newpcb, TcpServerRecv);
	return ERR_OK;
}

void TCPServerInit(void)
{
	struct tcp_pcb *tcppcbnew;  	//定义一个TCP服务器控制块
	struct tcp_pcb *tcppcbconn;  	//定义一个TCP服务器控制块
	err_t err;  
	
	tcppcbnew=tcp_new();	//创建一个新的pcb
	if(tcppcbnew)			//创建成功
	{ 
		err=tcp_bind(tcppcbnew,IP_ADDR_ANY,8088);	//将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
		if(err==ERR_OK)	//绑定完成
		{
			tcppcbconn=tcp_listen(tcppcbnew); 			//设置tcppcb进入监听状态
			tcp_accept(tcppcbconn,TcpServerAccept); 	//初始化LWIP的tcp_accept的回调函数
		}  
	}
}

tcpserver.h文章来源地址https://www.toymoban.com/news/detail-848400.html

#ifndef _TCPSERVER_H_
#define _TCPSERVER_H_

void TCPServerInit(void);

#endif

到了这里,关于RAW 编程接口 TCP 函数简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python2.7 中 print()函数的使用及input()、与raw_input()的区别

    一、python2.7 中 print()函数的使用: 直接输出双引号或单引号内的任何字符或数字 输出变量的值,不用加双引号或单引号,直接在()内写变量名称即可,或者print后面空格直接写变量名称 同时输出多项内容,不同内容用逗号隔开,不同内容包括双引号或单引号内的内容、

    2023年04月25日
    浏览(37)
  • ubuntu22.04安装ROS报错curl: (7) Failed to connect to raw.githubusercontent.com port 443: 拒绝连接

    ubuntu22.04安装ros时在执行下面命令时报错: 报错: curl: (7) Failed to connect to raw.githubusercontent.com port 443: 拒绝连接 同时执行后面命令 sudo apt update 的时候,同时报错: 解决办法: 1、在网站https://www.ipaddress.com中搜索raw.githubusercontent.com的IP地址,把找到的IP地址复制到host文件;

    2024年02月04日
    浏览(55)
  • PS Raw中文增效工具Camera Raw 16

    Camera Raw 16 for mac(PS Raw增效工具)的功能特色包括强大的图像调整工具 。例如,它提供白平衡、曝光、对比度、饱和度等调整选项,帮助用户优化图像的色彩和细节。此外,Camera Raw 16的界面简洁易用,用户可以快速上手。同时,它还提供了丰富的自定义选项,可以根据用户

    2024年02月05日
    浏览(41)
  • RAW图像详解及使用Python读取raw格式图像并显示

    RAW在英文中的解释是未处理的、自然状态的,这也就是RAW文件的真谛。RAW图像就是CMOS或者CCD图像感应器将捕捉到 的光源信号转化为数字信号的原始数据,因此RAW文件也被人们称之为“数码底片”。RAW格式的全称是RAW Image Format,记 录了由相机拍摄所产生的一些元数据,如IS

    2024年02月15日
    浏览(38)
  • 文件系统变成RAW问题解决

    对于打开分区提示需要格式化的情况,右击属性查看时,文件系统变成了RAW了,没有关系很好恢复,千万不要格式化。 可以看到该分区说明分区表没有问题,这是由于DBR扇区(即启动扇区)损坏造成的。 以上听不懂分析没有关系,对你的恢复影响不大。 有两种方法恢复:

    2023年04月12日
    浏览(40)
  • 使用raw.gitmirror.com替换raw.githubusercontent.com以解决brew upgrade python@3.12慢的问题

    MacOS系统上,升级python3.12时,超级慢,而且最后还失败了。看了日志,发现是用curl从raw.githubusercontent.com上下载Python安装包超时了。 解决方案一:开启翻墙工具,穿越围墙 解决方案二:使用raw.gitmirror.com替换raw.githubusercontent.com 翻墙有风险,操作需谨慎,这里我采用的是方案

    2024年03月16日
    浏览(80)
  • OpenCV显示10bit Raw数据

    参考:10 12 14bit图像存储格式,利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现: 结果: 红色箭头位置处的灰度值

    2024年02月20日
    浏览(33)
  • RAW、RGB、YUV 图像格式区别

    颜色是人的视觉系统对光谱中可见区域的感知效果,它仅存在于人的眼睛和大脑中。为了准确地描述颜色,必须引入色彩空间的概念。正如几何上用坐标空间来描述坐标集合,色彩空间用数学方式来描述颜色集合。 RAW 图像就是图像感应器将捕捉到的光源信号转化为数字信号

    2024年02月04日
    浏览(40)
  • lwIP更新记08:TCP 回调函数中调用 tcp_abort 终于安全了

    从 lwIP-1.4.0 开始,tcp 回调函数中调用 tcp_abort 函数终于安全了。 在此之前,如果从 tcp 回调函数中调用 tcp_abort ,则会访问未分配的内存。 应用程序关闭连接,正常情况下是调用 tcp_close 函数,经过 4 次握手安全的断开连接。但 lwIP 还支持另外一种关闭连接的 API 函数: tcp_

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包