c++软件服务端设计
2015-09-15 18:18:39 zhangbinsijifeng 阅读数 316
凡是你面试间游戏公司,无论是客户端,还是服务器,都是会问C++的东西,因为C++很多原理,在游戏中都是通用的,是做游戏的基础!服务器更是要注重C++,所以一般公司招做服务的,不会招毕业生!因为毕业生的C++功底和经验都是萎一大截!如果你有幸的话,你要珍惜,更加要珍惜带你做服务器的老大,如果他好,你就很快成长,不然就是悲催!
服务器一般都是做Linux方面的网络编程,数据库等编程以及测试等等!一般都是以C++为核心的!不过现在不管是客户端,服务器,都是脚本化编程比较多!因为一般都是写好框架,例如用Boost C++的网络组件,或ACE这个牛X的著名网络编程库,让别人来写脚本来实现具体需求!用得比较多是python,ruby,lua。所以如果你工作用脚本多了,要不时要去看看C++。
个别有些游戏公司,特别是现在的页游公司,是用erlang来做服务器编程。这个语言,你自己去了解下吧!是用于多核并行处理编程的。google好像有用这个,爱立信搞出来这个erlang的,也是用这个!
薪酬,一般会比较高!本省这个方向的,是吃经验的!不想客户端那些!
2018-06-17 14:22:27 zsyddl2 阅读数 287

    c++ 设计软件,其实简单,和c一样简单。不过现实中c++看起来很难,特别是stl boost的源码,将c++的表面难度看起来提升了几个数量级。这是要作死的节奏。

   轻松使用c++应该是这样的:抛开语言,划分模块,c是如何去划分,那就如何划分模块。再使用c++的类代替c的模块/结构体. 简单描述为 用c 去思考设计,用c++去编码实现(记忆中在某文章也看到这个观点,抱歉记不住引用的出处)。

    不要被所谓的c++设计的思想迷惑双眼。用的最好的c++就是带类的 c。一切最自然的方式才是最好的方式。(不过模块划分是前提,不分语言,问问自己是否真能做好软件的模块划分?)  

    什么stl,只是简单的数据结构支撑库,所以不用觉得源码太难。boost 更不推荐了,奇技淫巧太多。能有可以替代的功能库,就不用boost。上次没办法用到boost的 InterProcess 进程操作通信模块,再次晕菜在其中。居然一个参数不好好使用枚举类型,而使用一个临时类变量。也许说可以避免一点点使用错误,带来是巨大性能损失。这过程中大致调试发现,boost 各处充斥着无数类临时对象做参数传递。这么搞下去,c++不死都不可能了。 c++/c的难不是这点小错误的避免,最大的麻烦还是内存无gc。(一个典型场景是,socket异步模型中,为了删除链接,经常会使用到延迟删除)。 什么 shared_ptr 之类,让c++入门提升再次难上一个台阶, 当然熟练的人使用还是可以。有必要这么把c++往死里面搞呢?简单的解决就是引入gc,程序员控制自动回收还是 手动删除。

   大道至简,用c去思考设计,用c++编码实现。抛弃哪些奇技淫巧。

   准备在引入c/c++脚本化之后(llvm-clang方案),引入gc机制(这个难度挺大,难度还是在于各种库之间的交叉,希望能有一个折中解决办法)。

2016-05-22 16:06:00 weixin_33995481 阅读数 3

编写正常运行的程序很容易,但一旦数据量大起来,对代码的性能就需要认真考虑了。对于服务器来说,如果客户端一次访问,就需要话费几百毫秒,那么一旦每秒的访问次数多起来,后续的请求就会造成很明显的延迟。严重影响用户体验。最近做后端服务也遇到了一些需要优化的问题,数据量大了后,有明显延迟。 性能优化的前提是良好的构架设计:如果架构本身的设计就存在问题,在怎么优化也所能提升的空间也是很小。根据二八原则,大部分性能应该消耗在很少的地方,所以优化的关注点就在于那20%最耗时的代码块,解决了这个问题,整体性能就会有很大的提升。 代码层面的优化一般涉及到一下方面: ##1.并发模型的选择 对于不同的功能需要用不同的并发模型,适合单线程还是多线程,以及线程池这些都会影响到性能,对于服务器,模块是io密集型还是计算密集型。例如如果一次请求是需要做很多的计算,那么用线程池是合理的能够简化编程,但是如果一次请求主要时间是等待io,那么线程池是无法提升吞吐量的。 ##2.数据的存储 ###容器的选择 数据对象的存储方式取决于对数据的使用方式,就拿C++容器来说,如果要存储物品信息,一般系统中更多的是根据物品id来获取物品信息,那么久需要用key-value来存取,但map是红黑树,unorder_map是哈希表,哈希表的查询时间是O(1),而对于map,插入、删除都是O(logN),最坏和平均都是。 ###存取方式 是存指针还是存数据,这个需要根据具体问题,具体分析,尽量高效。 ##3.算法 算法的存在就是为了高效的解决一些复杂问题,以减少时间或者空间复杂度。一个排序就有很多种选择,冒泡,选择,快排,堆排序,堆排序,归并等。一般来说快排的整体效率比较高,那是针对于基本无序的序列,如果只是后来的元素无序,前面基本有序,这时候简单的使用快排就会造成降低性能。 ##4.代码质量 ###使用引用 在C++中尽量采用引用传递或者指针传递,这样不会产生参数拷贝,如果传入参数是一个复杂的数据结构,就能明显的提升性能。同理获取数据时也要用引用。 ###减少副作用 例如C++是不进行边界检查的,对于map的获取value,如果该key不在map中,map会插入一个key,value为默认值

    std::map<int,int> i_map;
    int value = i_map[123];

map是红黑树实现的,红黑树最终是一平衡树,这个插入操作会导致原来的树不平衡,内部就需要翻转达到平衡,这就会造成性能消耗。 ###同一变量的多次获取:

std::vector<int> v_int;
...
for (int i = 0; i < v_int.size(); i++)

怎么写出高质量的C++代码,推荐一本书 《高质量C++/C编程指南》。 ###同步锁 服务器编程会涉及到多线程,一旦涉及多线程,多线程中很多涉及到竞争资源的非原子操作都需要进行加锁,加锁的方式有很多种有信号量,互斥器,条件变量,读写锁。绝大多数情况使用互斥器就可以足够实现大多数功能,而且相对于其他锁性能影响较小。但在使用mutex时也需要注意。

  • 锁的范围:只在需要同步的操作前后加锁和解锁,避免造成其他线程的无效的等待,造成性能损失。
  • 尽量将操作划分,对于多种无前后依赖的临界资源,用多个互斥器。

转载于:https://my.oschina.net/u/156466/blog/679362

C++软件
2015-08-28 22:18:11 qq_19875391 阅读数 431
minGW编译器是一个很麻烦的软件。。。。。官网已经不再更新。。。
2019-07-09 16:05:35 weixin_44789624 阅读数 9

客户端请在我的博客里面找一下,一套的,如果有问题,可以加我QQ1092230704,,,,我也是初学者,可以交流一下
#include "pch.h"
#include <iostream>

#include <cstdio>
#include<iostream>
#include<string>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
const int PORT = 8888;
#define MaxClient 10
#define MaxBufSize 1024
#define _CRT_SECURE_NO_WARINGS
//服务线程
DWORD WINAPI ServerThread(LPVOID lpParameter) {
	SOCKET *ClientSocket = (SOCKET*)lpParameter;
	int receByt = 0;
	char RecvBuf[MaxBufSize];
	memset(RecvBuf, 0, sizeof(RecvBuf));
	char SendBuf[MaxBufSize];
	memset(SendBuf, 0, sizeof(SendBuf));
	while (1) {
		receByt = recv(*ClientSocket, RecvBuf, sizeof(RecvBuf), 0);
		//buf[receByt]='\0';
		if (receByt > 0) {
			cout << "接收到的消息是:" << RecvBuf << "            来自客户端:" << *ClientSocket << endl;
			// cout<<receByt<<endl;
		}
		else
		{
			cout  << " 客户端" << *ClientSocket << "断开连接"  << endl;
			break;
		}
		//	memset(RecvBuf, 0, sizeof(RecvBuf));
		//cout << "请输入要发送到客户端的信息:" << endl;
		//cin >> RecvBuf;
		//gets(SendBuf);
		strcat_s(SendBuf, RecvBuf);
		int k = 0;
		k = send(*ClientSocket, SendBuf, sizeof(SendBuf), 0);
		if (k < 0) {
			cout << "发送失败" << endl;
		}
		memset(SendBuf, 0, sizeof(SendBuf));
	}//while
	closesocket(*ClientSocket);
	free(ClientSocket);
	return 0;
}

int main() {
	WSAData wsd;
	WSAStartup(MAKEWORD(2, 2), &wsd);
	SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN ListenAddr;
	ListenAddr.sin_family = AF_INET;
	ListenAddr.sin_addr.S_un.S_addr = INADDR_ANY;//表示填入本机ip
	ListenAddr.sin_port = htons(PORT);
	int n;
	n = bind(ListenSocket, (LPSOCKADDR)&ListenAddr, sizeof(ListenAddr));
	if (n == SOCKET_ERROR) {
		cout << "端口绑定失败!" << endl;
		return -1;
	}
	else {
		cout << "端口绑定成功:" << PORT << endl;
	}
	int l = listen(ListenSocket, 20);
	if (l < 0)
	{
		perror("listen failed");
		exit(1);
	}
	cout << "服务端准备就绪,等待连接请求" << endl;

	while (1) {
		//循环接收客户端连接请求并创建服务线程
		SOCKET *ClientSocket = new SOCKET;
		ClientSocket = (SOCKET*)malloc(sizeof(SOCKET));
		//接收客户端连接请求
		int SockAddrlen = sizeof(sockaddr);
		*ClientSocket = accept(ListenSocket, 0, 0);
		cout << "一个客户端已连接到服务器,socket是:" << *ClientSocket << endl;
		CreateThread(NULL, 0, &ServerThread, ClientSocket, 0, NULL);
	}//while
	closesocket(ListenSocket);
	WSACleanup();
	return(0);
}

c++设计

阅读数 187

设计和C++

阅读数 290

C++ as3 socket服务端

阅读数 502

没有更多推荐了,返回首页