C/C++封装:Windows/Linux下封装.lib/.so文件

news2024/10/6 20:37:18

C/C++ TCP/IP通信函数

这里提供了两个C/C++中服务器与客户端之间通讯的两个程序,程序中封装了通信之间的函数方法,我们以这个程序为例进行封装。
文件目录结构按照C/C++标准开源项目进行存放:

├─bin
├─doc
├─lib
└─src
    ├─xsocket
    │  │  XTCP.h
    │  │  XTCP.cpp

XTCP.h

#ifndef XTCP_H //保证只初始化一次
#define XTCP_H

#ifdef WIN32
#pragma once

#ifdef XSOCKET_EXPORTS
#define XSOCKET_API __declspec(dllexport)
#else
#define XSOCKET_API __declspec(dllimport)
#endif

#else
#define XSOCKET_API
#endif // WIN32

#include<string>
class XSOCKET_API XTCP
{
public:
	int createSocket();
	bool bindListen(unsigned short port);
	void closeSocket();
	int receiveData(char* buf,int bufsize);
	int sendData(const char* buf, int sendsize);
	bool connectSocket(const char* ip, unsigned short port);
	XTCP acceptClient();
	XTCP();
	virtual ~XTCP();

	int sock = 0;
	unsigned short port = 0;
	char ip[16];
};
#endif // !XTCP_H

XTCP.cpp

#include "XTCP.h"
#ifdef WIN32
#include<Windows.h>
#define socklen_t int
#else
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
//函数名替换,重定义,将close关闭sock的函数转化为closesocket
#define closesocket close
#define strcpy_s strcpy
#endif
#include <iostream>
#include<stdlib.h>
#include<cstring>

XTCP::XTCP() {
#ifdef WIN32
	static bool is_first = true;
	if (is_first) {
		is_first = false;		
		//通过进程启动Winsock DLL使用
		WSADATA ws;
		WSAStartup(MAKEWORD(2, 2), &ws);		
	}
#endif
}


bool XTCP::connectSocket(const char* ip, unsigned short port) {
	if (sock <= 0) {
		createSocket();
	}
	sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(port);
	//将字符串ip地址转化为网络地址
	saddr.sin_addr.s_addr = inet_addr(ip);

	if (connect(sock, (const sockaddr*)&saddr, sizeof(saddr)) != 0) {
		// strerror(errno)将错误转化为字符串
		std::cout << "connect " << ip << " : " << port << " failed! ";
		return false;
	}
	std::cout << "connect " << ip << " : " << port << " success!\n ";
	return true;
}

int XTCP::createSocket() {
	//创建socket,创建失败返回-1,AF_INET表示ipv4协议,SOCK_STREAM表示接受tcp/ip协议的数据
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == -1) {
		std::cout << "create socket failed" << std::endl;
	}
	return sock;
}

bool XTCP::bindListen(unsigned short port) {
	if (sock <= 0) {
		createSocket();
	}
	//绑定地址
	sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	//大端字节序和小端字节序的问题,
	saddr.sin_port = htons(port);
	//0设置为绑定本机地址
	saddr.sin_addr.s_addr = htonl(0);

	//绑定地址
	if (bind(sock, (sockaddr*)&saddr, sizeof(saddr)) != 0) {
		std::cout << "bind port " << port << " failed.\n";
		return false;
	}
	std::cout << "bind port " << port << " successful.\n";

	//监听客户端发送的信息
	//backlog=10表示缓冲大小
	listen(sock, 10);
	return true;
}

XTCP XTCP::acceptClient() {
	XTCP tcp;
	//每个连接就会生成一个client
	sockaddr_in caddr;
	socklen_t len = sizeof(caddr);
	//在accept之前会进行三次握手(由操作系统完成),accept只是获取了握手后的信息
	int client_sock = accept(sock, (sockaddr*)&caddr, &len);
	if (client_sock <= 0) {
		return tcp;
	}
	tcp.sock = client_sock;
	std::cout << "accept client " << client_sock << ".\n";
	char* ip = inet_ntoa(caddr.sin_addr);
	strcpy_s(tcp.ip, ip);
	tcp.port = ntohs(caddr.sin_port);
	std::cout << "client ip address " << tcp.ip << ".\n";
	std::cout << "client port " << tcp.port << ".\n";
	return tcp;
}


int XTCP::receiveData(char* buf, int bufsize) {
	return recv(sock, buf, bufsize, 0);
}

int XTCP::sendData(const char* buf, int sendsize) {
	//需要全部发送完全才能结束
	int sendedSize = 0;
	while (sendedSize!=sendsize) {
		int len = send(sock, buf + sendedSize, sendsize - sendedSize, 0);
		if (len <= 0) {
			break;
		}
		sendedSize += len;
	}
	return sendedSize;
}

void XTCP::closeSocket() {
	if (sock <= 0) {
		return;
	}
	closesocket(sock);
}

XTCP::~XTCP() {

}

Linux封装.so文件

首先编写编写makefile文件,用于编译两个程序,可以按照以下命令进行编译,编译后将会在同级目录下生成一个libxsokcet.so文件,理论上这个时候Linux封装就完成了。

libxsocket.so:XTCP.cpp XTCP.h
        g++ $+ -o $@ -fpic -shared -std=c++11

但是在实际过程中,常常会出现一个.so文件不存在/找不到的问题。我们在这里编写一个测试程序,项目创建在和xsocket的同级目录,测试libxsocket.so是否可以调用。

testTCP.cpp

#include <iostream>
#include"XTCP.h"

int main()
{
	XTCP client;
	client.connectSocket("192.168.245.129", 8080);
	return 0;
}

我们通过以下程序编译这个程序之后:

testTCP:testTCP.cpp
        g++ $+ -o $@ -I../xsocket -std=c++11 -lpthread -lxsocket -L../xsocket

可以发现,尽管我们在编译过程中设置了libxsocket.so的路径所在位置,但是在运行之后还是会存在找不到文件,报错内容如下error while loading shared libraries: libxsocket.so: cannot open shared object file: No such file or directory,所以在运行的时候需要重新编写一个脚本,来执行testTCP,并且显示指定libxsocket.so的路径所在位置,脚本如下所示:

export LD_LIBRARY_PATH=../xsocket
./testTCP

这样testTCP就执行成功了。

Windows封装.lib文件

Windows封装.lib文件,我们借助vs studio 2019编译器完成编译,还是以上述两个文件和文件结构为例:

首先在xsocket的同级目录创建一个项目(选择具有导出项的(DLL)动态链接库,千万不要选错了),项目名自取。


项目创建后将会自动生成一些配置文件,如下图所示

然后将XTCP.hXTCP.cpp文件添加到目前这个新建的项目中来,文件结构如上图所示,具体简体方法,

  1. XTCP.hXTCP.cpp文件添加到当前项目目录。
  2. 选择 头文件 -> 添加 -> 现有项 ,添加XTCP.h文件。
  3. XTCP.cpp文件和XTCP.h文件添加方法一致。


添加文件后,需要设定一系列的项目配置项:

1、选择项目,右键,选择属性

修改输出目录

修改工作目录


取消预编译头


修改导出库目录


然后点击运行就会在bin目录生成和项目同名的dll文件了。

中间可能会有一个弹窗显示错误,可以忽略,只要编译显示没有失败/错误就行。

验证是否可以使用,在项目目录新建一个项目,用于验证该dll是否可以使用:

在新建项目的 解决方案上右键,选择添加现有项目,将刚才打包的项目添加进行,选择.vcxproj文件。

然后再右键 解决方案 ,设置启动项目和项目依赖项,

按照下图设置,设置新建项目为主项目,依赖项目为打包项目。

然后再设置当前项目的动态链接库位置,选择当前项目,右键,选择属性,如下图所示:






然后再在当前项目新建一个cpp文件运行以下程序,

#include <iostream>
#include"XTCP.h"

int main()
{
	XTCP client;
	client.connectSocket("192.168.245.129", 8080);
	return 0;
}

如果不报错则,动态链接库封装成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

influxdb 新增数据失败原因解析

前几天本地装了一个influxdb时序数据库&#xff0c;但是通过java新增数据一直失败&#xff0c;奇怪的是measurement和tag都能顺利添加&#xff0c;但是field一直没值。 最开始以为是用户权限&#xff0c;结果发现并不是。 最终原因&#xff1a;influxdb只能往默认的保留策略里…

中国人民大学与加拿大女王大学金融硕士——在职读研为自己而战,为未来而战

还记得去年大街小巷上广为流传的一首歌吗&#xff0c;“去吗 去啊 以最卑微的梦&#xff0c;战吗 战啊 以最孤高的梦&#xff0c;致那黑夜中的呜咽与怒吼&#xff0c;谁说站在光里的才算英雄”。这首歌表达了卑微的生活和梦想并不能击垮每个平凡的奋斗者。我们都有一个大梦想&a…

windbg 双机调试环境搭建(虚拟机)

windbg 双机调试环境搭建&#xff08;虚拟机&#xff09; WinDbg 下载安装下载安装 虚拟机下载安装下载安装虚拟机软件 VMware下载 Windows 镜像&#xff0c;新建虚拟机 WinDbg 建立连接使用演示参考资料 WinDbg 是一个调试器&#xff0c;可用于分析故障转储、调试实时用户模式…

提高驾驶安全性 | 基于ACM32 MCU的胎压监测仪方案

概述 作为车辆的基础部件&#xff0c;轮胎是影响行车安全不可忽视的因素之一。据统计&#xff0c;中国每年由胎压问题引起轮胎爆炸的交通事故约占 30%&#xff0c;其中 50%的高速交通事故是由车辆胎压异常引起。因此&#xff0c;准确实时地监测车辆在行驶过程中的轮胎压监测系…

HarmonyOS/OpenHarmony应用开发-程序包多HAP机制(下)

三、多HAP的开发调试与发布部署流程 &#xff08;一&#xff09;多HAP的开发调试与发布部署流程如下图所示。 图1 多HAP的开发调试与发布部署流程 &#xff08;二&#xff09;开发 开发者通过DevEco Studio工具按照业务的需要创建多个Module&#xff0c;在相应的Module中完成…

【Unity 实用插件篇】 | 使用Fungus插件制作一个对话系统,简单好学易上手

前言 【Unity 实用插件篇】| 使用Fungus插件制作一个对话系统&#xff0c;简单好学易上手一、Fungus介绍二、Fumgus导入三、Fungus功能使用3.1 基础对话效果实现3.2 搭建简单场景测试3.3 触碰 对话3.4 条件对话3.4 分支 对话3.5 改变对话UI视图 四、常用功能菜单介绍4.1 Flowch…

【前端】自制密码展示隐藏按钮

效果 一、前期准备 使用的图片是iconfront上拿的svg代码环境是Vue2 Element 二、创建组件 showPasswordAndclose <template><span class"show-password-container"><span v-if"chooseType CLOSE" click"changeType"><…

一文读懂Nacos原理及实践

文章目录 0. 前言0.nacos 介绍什么是 Nacos&#xff1f;Nacos 地图 1. 原理解析1.1 服务注册与发现流程一、服务注册流程二、服务发现流程三、注册中心高可用性机制 1.2. 原理解析一、服务注册与发现的概念二、服务注册与发现的流程2. 服务发现流程3. 服务负载均衡流程 三、服务…

javascript 将json数据导出excel

<el-button type"primary" plain v-on:click"jsonToExcel();">导出</el-button>jsonToExcel() {const data this.AlarmData;let head "城市,站点,时间,A相电流(A),B相电流(A),C相电流(A),SO2压力(MPa),CO压力(MPa),NOX压力(MPa),A相电压…

Activity引擎(初次学习与总结梳理全记录,包括易混淆知识点分析,常用报错解决方案等)

最近工作需要使用Acticity框架处理审批业务&#xff0c;简单了解后能虽能很快的上手&#xff0c;但是对于Activity的整体认识并不够&#xff0c;特此花费很多精力全面的学习并记录。包含对很多的概念的第一次理解过程&#xff1b;对知识点的混淆地方的梳理&#xff1b;对实践过…

mysql索引优化和锁

mysql索引优化和锁 IO操作与索引 IO操作上数据库性能的瓶颈之一&#xff0c;每次进行IO操作都需要消耗时间和资源。 核心:尽量减少 IO 操作的次数 读取次数少且读取量少是优化IO操作的核心目标。采用分块读取和局部性原理。 分块读取&#xff1a;将磁盘上的数据划分为若干…

黑马程序员编著过哪些教材?

黑马程序员是一家知名的IT培训机构&#xff0c;他们发布了许多教材和课程。 《Python入门教程》&#xff1a;介绍Python编程语言的基础知识和常用技巧。 《Java从入门到精通》&#xff1a;全面介绍Java编程语言的基础知识和高级特性。 《Web前端开发教程》&#xff1a;涵盖HT…

JDK压缩包安装,tomcat压缩包安装

1.解压JDK后进入我的电脑高级设置 2.新建系统变量&#xff08;变量名为JAVA_HOME&#xff0c;值为jdk文件夹的绝对地址&#xff09; 3.再次新建系统变量&#xff08;变量名为CLASSPATH&#xff0c;值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar&#xff09; 4.进入系…

教你如何快速准确地掌握AI最新技术

文章整理自&#xff1a;https://twitter.com/jbhuang0604/status/1426039195542360070?s21 人工智能领域如何follow最新技术&#xff1f;这应该是咱们这个行业非常关心的问题之一吧。 当你刚开始进行研究时&#xff0c;会发现每年都有成千上万的论文&#xff0c;如何在这些海…

代码随想录二刷day55 | 动态规划之子序列 392.判断子序列 115.不同的子序列

day55 392.判断子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 115.不同的子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

测试老鸟整理,Jmeter常用线程组+场景实例,一篇速通测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter中通过线程…

FITC标记牛血清白蛋白(FITC-BSA)溶解性

FITC-BSA是一种常用的荧光探针&#xff0c;用于生物化学和细胞生物学研究。FITC-BSA具有溶解性&#xff0c;可以在溶液中均匀分布。 溶解性1&#xff1a; FITC标记的牛血清白蛋白&#xff08;FITC-BSA&#xff09;在适当的条件下具有良好的溶解性。FITC-BSA通常以固体形式供应…

概率论的学习和整理18:为什么 P(至少成功1次) = Σ P(几何分布) ,总结几何分布和连续失败概率的关系,二项分布和累计成功k次的关系

目录 1 先说结论&#xff1a; 2 Σ几何分布的P(xn) P(n次试验至少成功1次) 2.1 几何分布的概率 2.2 这个是可以证明的&#xff0c;下面是推导过程 2.3 怎么理解呢&#xff1f; 3 另外&#xff0c;P(累计成功k次) ΣP(成功k次的二项分布) 3.1 成功k次的概率 和 累计成…

C# NPOI读取Excel中文乱码

Win11, 程序中需要从Excel表格读取中文内容&#xff0c;实测发现有中文乱码问题&#xff1a; class name:??Vege 奇怪的问号&#xff0c;原文是“蔬菜Vege”。 网上找了一圈&#xff0c;没找到NPOI中文乱码的解决方案&#xff0c;普遍都是比较顺利没遇到中文乱码问题。 那…