基于MFC的简易TCP/IP调试助手开发

2023-05-16

在学习TCP/IP通讯过程中,打算参考网上的教程写一个简易的调试助手,服务器与客户端分别参考以下两位代码完成,效果图如下。

1、如何基于TCP/IP协议进行MFC Socket网络通讯编程_Ezreal_zh的博客-CSDN博客_mfc tcp通信

2、使用MFC制作简易TCP客户端_哔哩哔哩_bilibili

 

        首先我们要了解windows套接字的编程流程是什么,分为服务器和客户端:

服务器:

1、加载套接字库 
2、创建套接字(socket)。 
3、将套接字绑定到一个本地地址和端口上(bind)。 
4、将套接字设为监听模式,准备接收客户请求(listen)。 
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 
6、用返回的套接字和客户端进行通信(send/recv)。 
7、返回,等待另一客户请求。 
8、关闭套接字

客户端程序:

1、加载套接字库 
2、创建套接字(socket)。 
3、向服务器发出连接请求(connect)。 
4、和服务器端进行通信(send/recv)。 
5、关闭套接字。

原文链接:https://blog.csdn.net/qq_32171677/article/details/60959137

        首先新建一个项目,选中基于对话框,勾选windows(套接字),选择完成即可。

        要完成标签页的切换效果需要用到MFC 的Tab Control控件,在主窗口添加 Tab Control控件,然后需要插入两个DIALOG资源,

将其ID分别命名为IDC_DIALOG_SERVER,和IDC_DIALOG_CLIENT。

        由于服务端和客户端是作为子级页面存在与标签页中,所以需要将其属性中的

Stlye设置为:Child(子级),同时将其Border属性设置为:none(无)

分别为server、client标签页添加类,基类为CDialogEX

双击Tab Control控件,生成OnTcnSelchangeTab1消息函数,同时选中控件右键 添加变量 :m_tab,

在头文件中,声明server,client 的对象用于绑定切换    CClient client; CServer    server;需要include Server 和Client


// TCP_IPDlg.h : 头文件
//

#pragma once
#include "afxcmn.h"
#include "Client.h"
#include "Server.h"

// CTCP_IPDlg 对话框
class CTCP_IPDlg : public CDialogEx
{
.
.
.
.
.
.
.
.
.
public:
	CTabCtrl m_tab;
	afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);

public:
    CClient client;
	CServer	server;

}

在OnInitDialog函数中初始化标签页的大小和绑定关系。

BOOL CTCP_IPDlg::OnInitDialog()
{
.
.
.
.
.
.
.
// TODO: 在此添加额外的初始化代码

	m_tab.InsertItem(0, _T("Server"));		//插入Server标签
	m_tab.InsertItem(1, _T("Client"));		//插入Client标签

	server.Create(MAKEINTRESOURCE(IDD_DIALOG_SERVER), &m_tab);	//创建server标签页
	client.Create(MAKEINTRESOURCE(IDD_DIALOG_CLIENT), &m_tab);	//创建client标签页

	CRect tabRect = { 0x00 }, tabWinRect = { 0x00 }; //标签控件客户区的Rect
													 //设置客户区Rect
	m_tab.GetClientRect(&tabRect);


	tabRect.left += 2;
	tabRect.right -= 2;
	tabRect.top += 23;
	tabRect.bottom -= 2;


	//根据调整好的tabRect放置server,client对话框,并设为显示
	server.MoveWindow(&tabRect);
	client.MoveWindow(&tabRect);
	server.ShowWindow(TRUE);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

在OnTcnSelchangeTab1设置切换的显示关系

void CTCP_IPDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	*pResult = 0;
	// TODO: 在此添加控件通知处理程序代码
	CRect tabRect, tabWinRect;
	m_tab.GetClientRect(&tabRect);
	tabRect.left += 5;
	tabRect.right -= 5;
	tabRect.top += 23;
	tabRect.bottom -= 5;


	switch (m_tab.GetCurSel()) {//返回组合框中列表框中当前选中的项的下标,如果没有选中项返回CB_ERR
								//如果当前选中为标签1 server
	case 0:
		server.ShowWindow(TRUE);
		client.ShowWindow(FALSE);
		break;
		//如果当前选中为标签2 client
	case 1:
		server.ShowWindow(FALSE);
		client.ShowWindow(TRUE);
		break;
	default:
		server.ShowWindow(TRUE);
		break;
	}
}

         主界面的显示功能便完成,可进行server,client标签页的切换,接下来先进行client客户端的开发。

        在客户端界面,我们需要添加五个Edit Control控件用于输入IP地址、PORT端口号,显示日志文件,接收显示服务器消息以及输入发送服务端的内容;添加两个Button控件用于连接/断开连接和发送消息,具体布局如下,控件ID可分别设置为:

IDC_EDIT_IP

IDC_EDIT_PORT

IDC_EDIT_LOG

IDC_EDIT_RECEIVE

IDC_EDIT_SEND

IDC_BUTTON_CONNECT

IDC_BUTTON_SEND

为IDC_EDIT_LOG控件添加变量m_log,类别为control用于日志内容显示

为IDC_EDIT_SEND控件添加变量m_send,类别为value,用于保存控件输入发送的内容

双击IDC_BUTTON_CONNECT、IDC_BUTTON_SEND生成消息函数

        参照原文使用的接收服务器消息的实现方法为,添加一个ClientJin类,基类为CSocket,添加消息函数OnReceive具体操作为:在类视图中找到CTCP_IPDlg类(你的主窗口类),右键打开“类向导”,点击“添加类”

ClientJin.h代码如下:

#pragma once
#include "afxsock.h"

class CClient;

class CClientJin :
	public CSocket
{
public:
	CClientJin(CClient* pDlg);
	virtual ~CClientJin();
	virtual void OnReceive(int nErrorCode);

private:
	CClient* m_dlg;
};

 ClientJin.cpp代码如下:

#include "stdafx.h"
#include "ClientJin.h"
#include "Client.h"
#include "Resource.h"
#include "TCP_IP.h"
#include "TCP_IPDlg.h"

CClientJin::CClientJin(CClient* pDlg) : m_dlg(pDlg)
{
}


CClientJin::~CClientJin()
{
}


void CClientJin::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	char* pData = NULL;
	pData = new char[1024];
	memset(pData, 0, sizeof(char) * 1024);
	CString str;
	Receive(pData, 1024);
	str = pData;

	CTCP_IPDlg* mainDlg = (CTCP_IPDlg*)theApp.GetMainWnd();
	if (mainDlg != NULL)
	{
		mainDlg->client.SetDlgItemText(IDC_EDIT_RECEIVE, str);
	}
	//if (m_dlg != NULL)
	//{
	//	m_dlg->SetDlgItemTextW(IDC_EDIT_RECEIVE, str);
	//}

	delete pData;
	pData = NULL;
	CSocket::OnReceive(nErrorCode);
}

回到Client类,在头文件添加以下声明,并在cpp文件实现

//系统自动生成
public:
	CEdit m_log;
	CString m_send;
	afx_msg void OnBnClickedButtonConnect();
	afx_msg void OnBnClickedButtonSend();


//自己手动添加
public:
	CClientJin sock;
	bool m_connect = false;//用于判断服务器:连接/断开连接
	void Log(CString str);
	

连接功能实现:

void CClient::OnBnClickedButtonConnect()
{
	// TODO: 在此添加控件通知处理程序代码
	if (m_connect == true) {//m_connect初始定义为false

		m_connect = false;
		sock.Close();
		SetDlgItemText(IDC_BUTTON_CONNECT, _T("连接服务器"));
		Log(_T("断开连接成功"));
		return;
	}
	if (!sock.Create()) {
		MessageBox((_T("创建端口失败")));
		return;
	}
	CString sIP;
	GetDlgItemText(IDC_EDIT_IP, sIP);
	UINT PORT = GetDlgItemInt(IDC_EDIT_PORT);
	if (!sock.Connect(sIP, PORT)) {
		MessageBox((_T("连接失败")));
		sock.Close();
		return;
	}
	m_connect = true;
	SetDlgItemText(IDC_BUTTON_CONNECT, _T("断开连接"));
	Log(_T("连接成功"));
}

发送功能实现:

void CClient::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	if (m_send != "") {
		m_send += "\r\n";
		int nlen = m_send.GetLength() + 1;
		char* pBuff = new char[nlen];
		memset(pBuff, 0, nlen);
		WideCharToMultiByte(CP_OEMCP, 0, m_send.GetBuffer(1), -1, pBuff, nlen, 0, 0);
		if (sock.Send(pBuff, nlen) == SOCKET_ERROR) {
			MessageBox((_T("发送失败")));
			return;
		}
		CString str;
		str = pBuff;
		str = _T("你发送的内容为:") + str;
		Log(str);

		delete pBuff;
	}
}

日志显示功能实现:

void CClient::Log(CString str)
{
	str += "\r\n";
	m_log.SetSel(-1, -1);//定位光标
	m_log.ReplaceSel(str);
}

        客户端功能便已完成,可以通过网络调试助手测试客户端通讯功能,我用的是NetAssist V5.0.2,下载连接:NetAssist网络调试助手下载_NetAssist5.0.2官方最新版下载 - 系统之家

        接下来便是服务器的开发,添加ListBox Control存放日志,添加一个Edit Control 用于输入发送的消息,两个Button控件用启动/断开服务器和发送消息,具体布局如下,控件ID可分别设置为:

IDC_LIST_SSEND

IDC_EDIT_SSEND

IDC_BUTTON_START

IDC_BUTTON_SSEND

为IDC_LIST_SSEND控件添加变量m_listwords,类别为control

 为IDC_EDIT_SSEND控件添加变量send_edit,类别为control

双击IDC_BUTTON_START和IDC_BUTTON_SSEND生成消息函数

在类向导中添加虚函数OnInitDialog()用于初始化

Serve.h代码如下:

服务器的启动我们以线程的方式启动,需要在头文件声明一个全局的IP和sock listen_sock和线程函数;然后在cpp文件中定义,为防止重复定义,需使用extern关键字

// CServer 对话框
extern CString IP;
extern SOCKET listen_sock;
extern SOCKET sock;
UINT server_thd(LPVOID p);

class CServer : public CDialogEx
{
.
.
.
.
.
.
.
.

//系统生成
public:
	CListBox m_listwords;
	virtual BOOL OnInitDialog();
	afx_msg void OnBnClickedButtonSsend();
	afx_msg void OnBnClickedButtonStart();

private:
	CEdit send_edit;


//手动生成
public:
	bool m_connect = false;
	void update(CString s);


}

在cpp文件中进行定义

// Server.cpp : 实现文件
//

#include "stdafx.h"
#include "TCP_IP.h"
#include "Server.h"
#include "afxdialogex.h"
#include "Resource.h"
#include <afxwin.h>

CString IP;
SOCKET listen_sock;
SOCKET sock;

// CServer 对话框

线程函数实现:

UINT server_thd(LPVOID p)
{
	CServer* dlg = (CServer*)  p;
	SOCKADDR_IN local_addr,client_addr;
	int iaddrSize = sizeof(SOCKADDR_IN);

	int res;
	char msg[1024];
	//CServer* dlg = (CServer *)AfxGetApp()->GetMainWnd();
	//char ch_ip[20];
	//CString2Char(IP, ch_ip);

	CString strFormat;

	//获取本地IP地址
	//local_addr.sin_addr.s_addr = inet_addr(ch_ip);
	local_addr.sin_addr.s_addr = INADDR_ANY;
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(8888);
	//创建套接字
	if ((listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
		dlg->update(_T("创建监听失败"));
		return -1;
	}
	//绑定套接字
	if (bind(listen_sock, (struct sockaddr*)&local_addr, sizeof(SOCKADDR_IN))) {
		strFormat.Format(_T("绑定错误:%d"), WSAGetLastError());
		dlg->update(strFormat);
		closesocket(listen_sock);
		return -1;
	}
    //监听端口
	if (listen(listen_sock, 1) != 0) {
		strFormat.Format(_T("listen错误:%d"), WSAGetLastError());
		dlg->update(strFormat);
		closesocket(listen_sock);
		return -1;
	}
	//接收套接字
	if ((sock = accept(listen_sock, (struct sockaddr*)&client_addr, &iaddrSize)) == INVALID_SOCKET) {
		dlg->update(_T("accept失败"));
		return -1;
	}else {
		CString port;
		port.Format(_T("%d"), int(ntohs(client_addr.sin_port)));
		dlg->update(_T("已连接客户端:") + CString(inet_ntoa(client_addr.sin_addr)) + _T("端口:") + port);
	}
	//接收数据
	while (1)
	{
		if ((res = recv(sock, msg, 1024, 0)) == -1) {
			dlg->update(_T("失去客户端连接"));
			break;
		}
		else {
			msg[res] = '\0';
			CString port;
			port.Format(_T("%d"), int(ntohs(client_addr.sin_port)));
			dlg->update(_T("\n") + CString(inet_ntoa(client_addr.sin_addr)) + _T("端口:") + port+ CString(msg));
		}
	}
	return 0;
}

OnInitDialog()函数如下 :

/ TODO:  在此添加额外的初始化
	send_edit.GetDlgItem(IDC_EDIT_SSEND);
	send_edit.SetFocus();

	WSADATA wsaData;
	WORD wVersion;
	wVersion = MAKEWORD(2, 2);
	WSAStartup(wVersion, &wsaData);

	return FALSE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE

update()函数如下:

void CServer::update(CString s)
{
	m_listwords.AddString(s);
}

启动/断开服务功能如下:

// TODO: 在此添加控件通知处理程序代码
	if (m_connect)
	{
		m_connect = false;
		closesocket(listen_sock);
		SetDlgItemText(IDC_BUTTON_START, _T("启动服务器"));
		update(_T("服务器已关闭"));
		return;
	}
	if (m_connect !=true)
	{
		char name[128];
		hostent* pHost;
		gethostname(name, 128);//获得主机名
		pHost = gethostbyname(name);//获得主机结构
		IP = inet_ntoa(*(in_addr*)pHost->h_addr);
		update(_T("本服务器IP地址为:") + IP);
		AfxBeginThread(server_thd, this);//创建线程

		m_connect = true;
		SetDlgItemText(IDC_BUTTON_START, _T("关闭服务器"));
		return;
	}

发送消息内容如下:

// TODO: 在此添加控件通知处理程序代码

	CString s;
	char msg[1024];
	send_edit.GetWindowTextW(s);
	CString2Char(s, msg);

	if (send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) {
		m_listwords.SetWindowTextW(_T("发送失败"));
	}else if (s==" ")
	{
		MessageBox(_T("请输入信息"));
	}
	else
	{
		//s = msg;
		//m_listwords.AddString(_T("server:") + s);
		update(_T("server:") + s);
		send_edit.SetWindowTextW(_T(""));
		m_listwords.SetFocus();
		
	}

至此所有功能均已完成,可用网络调试助手进行测试通讯,以上的代码为记录我的学习过程而制作的简易TCP/IP通讯助手,代码还存在很大的优化空间,如线程的同步问题,服务器的日志区,发送区分离,accept功能分块等,后续随缘更新,感谢观看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于MFC的简易TCP/IP调试助手开发 的相关文章

  • 如何在VC++/MFC中替换字符串中两个子字符串之间的字符串?

    假设我有一个 CString 对象 strMain AAAABBCCCCCCDDBBCCCCCCCCDDDAA 我还有两个较小的字符串 例如 strSmall1 BB strSmall2 DD 现在 我想替换 strMain 中 strSm
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 如何将基数词转换为序数词

    有没有一种简单的方法可以将数字 1 2 3 转换为 1st 2nd 3rd 并且以这种方式我可以为该函数提供一种语言并具有它会返回我目标语言的正确形式吗 标准 C stl 或 boost 都可以 MFC 或 ATL win32 api 或我
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 获取正在运行的程序的属性

    我想开发一个程序 其 ID 是一张牌 因为它在另一个正在运行的程序 例如扑克或红心游戏或其他程序 中播放 我首先尝试获取有关已运行的游戏程序的所需信息 但我从一开始就遇到了问题 我正在运行 MSVC 2013 并开发 MFC 应用程序 现在
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 分配 TCP/IP 端口供内部应用程序使用

    我编写了一个由 Windows 服务托管的 WCF 服务 它需要侦听已知的 TCP IP 端口 我可以在什么范围内安全地分配端口供我的组织内使用 该端口将嵌入到服务和使用该服务的客户端的配置文件中 端口 0 1023 是众所周知的端口 由
  • 如何强制关闭 TcpListener

    我有一个通过 tcpListener 进行通信的服务 问题是当用户重新启动服务时 抛出 地址已在使用 异常 并且服务在几分钟左右无法启动 有没有办法告诉系统终止旧连接 以便我可以打开一个新连接 我不能只使用随机端口 因为服务无法通知客户端端
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf

随机推荐

  • HMC5883L 磁力计校准

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8ie html 这里针对 HMC5883L 磁力计 的校准 xff0c 做一个简单讲解 欢迎交流 xff0c 新浪长沙 64 Wal
  • linux下如何编译c++工程项目

    首先 xff0c 你必须 有一 个Linux开发环境 xff0c 这样才能进行C 43 43 开发 笔者用的是安装在虚拟机中的Ubuntu 9 04 xff0c Ubuntu操作系统是没带C 43 43 编译器g 43 43 在连网的情况下
  • 【ROS程序】 --- 4-1. URDF-GAZEBO 文件介绍

    没人天赋异禀 xff0c 介绍两种实现对比发现 gaze中的urdf文件1 碰撞参数设置2 惯性矩阵设置3 颜色设置 介绍 在前边提过的rviz中 xff0c 只负责整体机器人的建模和运动 xff0c 而在gazebo中集成urdf文件则需
  • 【ROS机器人】 --- 2-2.slam建图保存

    山无拦 海无遮 xff01 前期准备建图I 运行机器人 gazebo II 建图文件编写III 配置rviz并保存1 添加机器人和雷达2 添加TF3 地图map4 保存配置 IV 控制运动建图V 保存地图1 map server2 保存查看
  • 【ROS机器人】 --- 2-4. 路径规划_move_base

    我回来啦 前期准备基础知识1 action通信2 代价地图及组成3 碰撞算法 文件详解及过程I 集成参数的launch文件II 配置文件1 costmap common params yaml2 global costmap params
  • 【ROS机器人】 --- 2-5.自主导航并slam建图

    压线才低头 前期准备基础知识编写launch文件执行流程最后重写launch文件 本节目标 xff1a 加载一张未知地图 xff0c 为机器人设置目标点 机器人会边走路 边建图 最后还可以用map server保存 实现 xff1a 打开g
  • [xdm+ip]ubuntu下载数据慢或者不通

    解决了从官网下载kitti数据集慢的问题 1 改ip 测ping2 更改 etc hosts文件3 使用xdm工具4 配置浏览器和xdm5 使用 环境 ubuntu20 04 问题 从kitti数据集官网下载数据集慢或不通的问题 使用过we
  • 【Docker】--5.docker图形化(享用主机的屏幕)

    心向骄阳万丈光 1 主机操作2 初始化容器3 注意查看效果 docker图形无法显示 网上流传两种方法解决 一种是lightdm 容器初始化好后 另一种是我亲测有用的这种 初始化容器时 1 主机操作 安装 span class token
  • [ros+python]无法rosrun 导入自定义.py文件的python可执行文件

    问题描述 在ROS环境下 自定义a py文件作为模块 被b py引用 rosrun b的时候疯狂报错 not found python文件可以单独用python编译器跑通过 放在rosrun下边就不对 解决办法 删除掉工作空间下之前编译残留
  • 【从kitti开始自动驾驶】--9.1 利用IMU/GPS测距并比较效果(jupyter)

    义勇添青史几段 1 基础知识1 1 角度计算1 2 距离计算 2 python程序编写2 1 大圆距离公式函数2 2 a GPS测距离2 2 b IMU测距离2 3 绘图2 4 效果展示2 5 结论 3 Measure distance源码
  • 【gdb调试器】gdb的调试参数和使用方法

    34 江山不负英雄泪 34 GDB调试器GDB主要功能常用调试命令参数 小例子测试gdb编译生成可执行文件调试查看 GDB调试器 GDB GNU Debugger 是一个用来调试C C 43 43 程序的功能强大的调试器 是linux系统开
  • 磁力计的基本工作原理

    此文详细讲解了 磁力计 的基本工作原理 干扰产生的原因以及如何校准 磁力计与倾角传感器如何结合使用等内容 原文地址 xff1a http www dzsc com data html 2010 11 29 87454 html 电子罗盘是一
  • Linux安装confluence

    一 准备工作 1 安装jdk 在官网下载Linux环境下的jdk1 8 xff1a https www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • [ROS+catkin_make]编译100%后出现 unreference to ...的现象

    问题描述 catkin make编译100 后 突然出现unreference to 的情况 但是能定义过去 即根据VSCODE可以追踪过去问题解决 静态成员变量必须在类外初始化
  • 【linux基础】7.linux系统自定义应用名和应用图标

    34 懦弱之人毫无价值 34 1 做应用和图标1 1 测试和加入侧边栏 3 命令行重命名唤醒 任务叙述 xff1a 有一个x sh文件可以在命令行执行 sh x sh xff0c 这样太麻烦 将其做成app且配上logo xff0c 下次直
  • [Linux基础]8. linux下脚本将pdf转各图片并合成长图

    34 你也有不看星星 34 1 将PDF的每一页转换为图片2 将转换后的多张图片合并为一张长图3 完整脚本 任务叙述 xff1a 已经有一个很长的pdf xff0c 要在linux上用脚本合成一张长图 xff0c 如果由程序完成将PDF转换
  • 【linux网络问题】,ping出现connect问题,知乎(ipv6)能通,百度ipv4通不了

    问题 今天遇到一个很奇怪的事情 xff0c 有线连接的ifconfig中没有ipv4的解析 xff0c 只有ipv6的解析系统是ubuntu20 04及以上nslookup 43 网址的时候发现能访问网络的都是被解析成ipv6的 xff0c
  • 制作树莓派SD卡备份镜像——树莓派系统备份与还原指南

    制作树苺派SD卡备份镜像 树苺派系统备份与还原指南 科技爱好者关注 0 1452016 05 28 22 12 33字数 501阅读 26 658 树莓派使用SD卡来安装系统 xff0c 如果SD卡丢失或者损坏 xff0c 那么树莓派上的数
  • ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

    转自 xff1a http blog chinaaet com jihceng0622 p 5100001238 坐在上海回北京的高铁上 xff0c 漫长的旅途着实让人感到无聊 xff08 没买到直达的高铁 xff0c 只能慢悠悠的走一站停
  • 基于MFC的简易TCP/IP调试助手开发

    在学习TCP IP通讯过程中 xff0c 打算参考网上的教程写一个简易的调试助手 xff0c 服务器与客户端分别参考以下两位代码完成 xff0c 效果图如下 1 如何基于TCP IP协议进行MFC Socket网络通讯编程 Ezreal z