【C++ 高并发服务器开发 -- 服务端代码】

cd ..                   切换到上级目录
mkdir 02_day/           创建目录
cd 02_day/              切换到该目录
vim 01_tcpServer.c      开始编写服务器代码

在这里插入图片描述

按 i 进入编辑模式,输入代码;

服务器端代码如下:
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <arpa/inet.h>
	#include <sys/socket.h>
	#include <unistd.h>
	
	int main(int argc, char * argv[])
	{
		// 1. 创建套接字
		int lfd = socket(AF_INET, SOCK_STREAM, 0);
		// 2. 绑定
		struct sockaddr_in addr;
		addr.sin_family = AF_INET;
		addr.sin_port = htons(8000);
		// addr.sin_addr.s_addr = INADDR_ANY; // 绑定的是通配地址
		inet_pton(AF_INET, "192.168.31.246", &addr.sin_addr.s_addr);
		bind(lfd, (struct sockaddr *)&addr, sizeof(addr));
		// 3. 监听
		listen(lfd, 128);
		// 4. 提取
		struct sockaddr_in cliaddr;
		socklen_t len = sizeof(cliaddr);
		int cfd
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip 基于Reactor高并发服务器 c++源码+详细项目说明+sln解决方案.zip 基于`Reactor`高并发服务器 `C++` > 基于`Reactor`的高并发服务器,分为`反应堆模型`,`多线程`,`I/O模型`,`服务器`,`Http请求`和`响应`五部分 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
这是一个比较复杂的问题,需要对网络编程和多线程编程有一定的了解。以下是一个简单的客户端和服务端代码示例,仅供参考。 服务端代码: ```cpp #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; // 服务端监听端口 const int PORT = 8080; // 最大连接数 const int MAX_CONNECTIONS = 10; // 互斥锁和条件变量 mutex mtx; condition_variable cv; // 任务队列 queue<SOCKET> tasks; // 线程函数 void worker_thread() { while (true) { // 等待任务队列非空 unique_lock<mutex> ul(mtx); cv.wait(ul, []() { return !tasks.empty(); }); // 取出一个任务 SOCKET client_socket = tasks.front(); tasks.pop(); // 处理任务 char buf[1024]; int n = recv(client_socket, buf, sizeof(buf), 0); send(client_socket, buf, n, 0); // 关闭连接 closesocket(client_socket); } } int main() { // 初始化Winsock WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { cerr << "WSAStartup failed" << endl; return 1; } // 创建监听套接字 SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_socket == INVALID_SOCKET) { cerr << "socket failed" << endl; return 1; } // 绑定地址 sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(PORT); if (bind(listen_socket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { cerr << "bind failed" << endl; return 1; } // 监听端口 if (listen(listen_socket, MAX_CONNECTIONS) == SOCKET_ERROR) { cerr << "listen failed" << endl; return 1; } // 创建工作线程 thread workers[4]; for (int i = 0; i < 4; i++) { workers[i] = thread(worker_thread); } // 接受连接并加入任务队列 while (true) { SOCKET client_socket = accept(listen_socket, NULL, NULL); if (client_socket == INVALID_SOCKET) { cerr << "accept failed" << endl; continue; } // 加入任务队列 unique_lock<mutex> ul(mtx); tasks.push(client_socket); cv.notify_one(); } // 关闭监听套接字 closesocket(listen_socket); // 关闭Winsock WSACleanup(); return 0; } ``` 客户端代码: ```cpp #include <iostream> #include <thread> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; // 服务器地址和端口 const char* SERVER_ADDR = "127.0.0.1"; const int PORT = 8080; // 发送和接收数据 void send_data(SOCKET s) { char buf[1024] = "hello"; send(s, buf, sizeof(buf), 0); } void recv_data(SOCKET s) { char buf[1024]; int n = recv(s, buf, sizeof(buf), 0); buf[n] = '\0'; cout << buf << endl; } int main() { // 初始化Winsock WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { cerr << "WSAStartup failed" << endl; return 1; } // 创建套接字 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { cerr << "socket failed" << endl; return 1; } // 连接服务器 sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); addr.sin_port = htons(PORT); if (connect(s, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { cerr << "connect failed" << endl; return 1; } // 发送和接收数据 send_data(s); recv_data(s); // 关闭套接字 closesocket(s); // 关闭Winsock WSACleanup(); return 0; } ``` 需要注意的是,以上代码仅仅是一个简单的示例,实际应用中还需要考虑许多因素,如线程池的大小、任务队列的容量、异常处理等等。同时,也需要适当地添加互斥锁和条件变量来保证线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值