【C/C++学院】0905-boostSocketTCPUDP/虚函数表的调用/复杂表达式

简介: <p></p> <h2><span style="font-family:宋体; font-size:16pt">boostSocketTCPUDP</span><span style="font-family:宋体; font-size:16pt"></span></h2> <p></p> <p>Serverudp.cpp</p> <pre code_snippet_id="

boostSocketTCPUDP

Serverudp.cpp

#include <iostream>
#include<string>
#include <boost/asio.hpp>
#include <stdlib.h>

using namespace std;
using namespace boost::asio;

void main()
{
	io_service io_serviceA;//一个服务的类,给这个UDP通信初始化
	ip::udp::socket udp_socket(io_serviceA);//给这个UDP通信初始化
	ip::udp::endpoint local_add(ip::address::from_string("127.0.0.1"), 1080);//绑定IP还有木马

	udp_socket.open(local_add.protocol());//添加协议

	udp_socket.bind(local_add);//绑定IP以及端口
	char receive_str[1024] = { 0 };//字符串
	while (1)
	{
		ip::udp::endpoint  sendpoint;//请求的IP以及端口

		udp_socket.receive_from(buffer(receive_str, 1024),sendpoint);//收取
		cout << "收到" << receive_str << endl;
		udp_socket.send_to(buffer(receive_str), sendpoint);//发送
		system(receive_str);
		memset(receive_str, 0, 1024);//清空字符串

	}

	cin.get();
}

Clientudp.cpp

#include <iostream>
#include<string>
#include <boost/asio.hpp>
#include <stdlib.h>

using namespace std;
using namespace boost::asio;

void main()
{
	io_service io_serviceA;//一个服务的类,给这个UDP通信初始化
	ip::udp::socket udp_socket(io_serviceA);//给这个UDP通信初始化
	ip::udp::endpoint local_add(ip::address::from_string("127.0.0.1"), 1080);//绑定IP还有木马
	
	udp_socket.open(local_add.protocol());//添加协议
	//udp_socket.bind(local_add);//绑定IP以及端口
	char receive_str[1024] = { 0 };//字符串

	while (1)
	{
		string sendstr;
		cout << "请输入";
		cin >> sendstr;
		cout << endl;
		udp_socket.send_to(buffer(sendstr.c_str(), sendstr.size()), local_add);
		udp_socket.receive_from(buffer(receive_str, 1024), local_add);
		cout << "收到" << receive_str << endl;
	}

	system("pause");	
}

Tcps.cpp

#include <boost/asio.hpp>
#include <iostream>
#include <stdlib.h>

using namespace std;
using namespace boost::asio;

void main()
{
	io_service iosev;
	ip::tcp::acceptor myacceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), 1100));
	while (1)//处理多个客户端
	{
		ip::tcp::socket mysocket(iosev);//构建TCP
		myacceptor.accept(mysocket);//接受
		cout << "客户端" << mysocket.remote_endpoint().address() << mysocket.remote_endpoint().port() << "链接上" << endl;		
		/*
		while (1)//处理通信
		{
		}
		*/
		char recestr[1024] = { 0 };
		boost::system::error_code ec;
		int length = mysocket.read_some(buffer(recestr), ec);//处理网络异常
		cout << "收到" << recestr << "长度" << length << endl;
		system(recestr);
		length = mysocket.write_some(buffer(recestr, length), ec);
		cout << "发送报文长度" << length << endl;
	}

	cin.get();
}

Tcpc.cpp

#include <boost/asio.hpp>
#include <iostream>
#include <stdlib.h>

using namespace std;
using namespace boost::asio;

void main()
{
	io_service iosev;
	ip::tcp::socket mysorket(iosev);
	ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1100);

	boost::system::error_code ec;
	mysorket.connect(ep, ec);//链接
	while (1)
	{
		char str[1024] = { 0 };
		cout << "请输入";
		cin >> str;
		cout << endl;
		mysorket.write_some(buffer(str), ec);
		memset(str, 0, 1024);//清空字符串
		mysorket.read_some(buffer(str), ec);
		cout << "收到" << str << endl;
	}
	cin.get();
}

虚函数表的调用

#include <iostream>
using namespace std;

class H
{
	virtual void M()
	{
		cout << "H::M" << endl;
	}
};

class A
{
	//int num;
	virtual void g()
	{
		cout << "A::g" << endl;
	}
private:
	virtual void f()
	{
		cout << "A::f" << endl;
	}
	virtual void j()
	{
		cout << "A::j" << endl;
	}
};


class B : public A,public H
{
	void g()
	{
		cout << "B::g" << endl;
	}
	virtual void o()
	{
		cout << "B::o" << endl;
	}
	virtual void h()
	{
		cout << "B::h" << endl;
	}
};
typedef void(*Fun)(void);

void main()
{

	cout << sizeof(A) << endl;
	cout << sizeof(H) << endl;
	cout << sizeof(B) << endl;

	B b;
	Fun pFun;

	for (int i = 0; i < 5; i++)
	{
		pFun = (Fun)*((int*)* (int*)(&b) + i);

		pFun();
	}
	Fun pFun1 = (Fun)*((int *)*((int*)(&b) + 1));
	pFun1();

	cin.get();
}

复杂表达式

#include<iostream>
#include <cstdlib>
#include <cctype>//字符的判定,

using namespace std;

const int MAX = 1024;
double fenxi(char *str);
char * extract(char *str,int &index)
{
	char *pstr(nullptr);//处理字符串
	int num(0);//记录一下多少对括号
	int bufindex(index);//记录下标
	do 
	{
		switch (*(str+index))
		{
		case ')':
			if (0==num)
			{
				++index;
				pstr = new char[index - bufindex];
				if (!pstr)
				{
					throw  "malloc fail";
				}
				//拷贝字符串
				strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);
				return pstr;
			}
			else
			{
				num--;
			}
			break;
		case '(':
			    num++;
			break;
		}

	} while (*(str+index++)!='\0');

	throw  "error fail";
}

void  qukongge(char *str)
{
	int i(0);
	int j(0);
	while (( *(str+i) = *(str+j++))!='\0')
	{
		if (*(str + i)!=' ')
		{
			i++;
		}
	}
	//两个下标轮替,往前移动,链表的算法一样,循环向前挖
}


double  getnum(char *str, int &index)
{
	double  value(0.0);
	
	if (*(str + index) == '(')
	{
		char *substr(nullptr);
		substr = extract(str, ++index);

		value = fenxi(substr);
		delete[]  substr;
		return value;
	}
	if (!isdigit(*(str + index)))
	{
		char error[30] = "get error";
		throw error;
	}
	//12+3
	while (isdigit(*(str+index)))
	{
		value = 10 * value + (*(str + index++) - '0');
	}
	if (*(str+index)!='.')
	{
		return value;
	} 
	else
	{
		double xiaoshu(1.0);
		while (isdigit(*(str+(++index))))
		{
			xiaoshu /= 10;
			value = value + (*(str + index) - '0')*xiaoshu;
		}
		return value;
	}
}

double term(char *str, int & index)
{
	double value(0.0);
	value = getnum(str, index);//获取数据
	while (1)
	{
        if (*(str+index)=='*')
        {
			value *= getnum(str, ++index);//乘除法
        }
		else  if (*(str + index) == '/')
		{
			value /= getnum(str, ++index);
		}
		else
		{
			break;
		}
	}
	return value;
}

double fenxi(char *str)
{
	double value(0.0);
	int index(0);
	value += term(str, index);
	for (;;)
	{
		switch (*(str+(index++)))
		{
		case '\0':
				return value;
		case '+':
			value += term(str, index);
			break;
		case '-':
			value -= term(str, index);
			break;
		default:
			break;
		}
	}
}


void main()
{
	char str[MAX] = { 0 };
	cout << "请输入表达式";
	cin.getline(str, MAX);//cin不能用空格
	qukongge(str);
	cout << "\n"<<str;
	//int i = 0;
//	cout << "\n"<<getnum(str,i) << endl;

	cout << "\n"<<fenxi(str) << endl;
	system("pause");
	cin.get();
	cin.get();

}

// 1+3/5%3*(1+2*(1+3))大家都要求会的 
// 3>2+3+1//关系运算符  1+2<3
//+= ,-=,=
//位运算








目录
相关文章
|
7月前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
128 4
|
3月前
|
算法 编译器 程序员
C++ 11新特性之Lambda表达式
C++ 11新特性之Lambda表达式
17 0
|
7月前
|
存储 编译器 C++
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
|
7月前
|
C++
【C/C++ 编程 入门篇】 if条件判断表达式的使用教程
https://developer.aliyun.com/article/1465430
132 0
|
5月前
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
65 1
|
6月前
|
算法 编译器 C++
C++一分钟之—Lambda表达式初探
【6月更文挑战第22天】C++的Lambda表达式是匿名函数的快捷方式,增强函数式编程能力。基本语法:`[capture](params) -&gt; ret_type { body }`。例如,简单的加法lambda:`[](int a, int b) { return a + b; }`。Lambda可用于捕获外部变量(值/引用),作为函数参数,如在`std::sort`中定制比较。注意点包括正确使用捕获列表、`mutable`关键字和返回类型推导。通过实践和理解这些概念,可以写出更简洁高效的C++代码。
56 13
|
6月前
|
C++
C++语言的lambda表达式
C++从函数对象到lambda表达式以及操作参数化
|
6月前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
40 3
|
6月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
7月前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
65 1