#pragma once#include <iostream>#include <unistd.h>static void Service(std::string ip, int port, int sock){while (1){char buf[256];ssize_t size = read(sock, buf, sizeof(buf)-1);if (size > 0){// 正常读取size字节的数据buf[size] = 0;std::cout << "[" << ip << "]:[" << port<< "]# "<< buf << std::endl;std::string msg = "server get!-> ";msg += buf;write(sock, msg.c_str(), msg.size());}else if (size == 0){// 对端关闭std::cout << "[" << ip << "]:[" << port<< "]# close" << std::endl;break;}else{// 出错std::cerr << sock << "read error" << std::endl;break;}}close(sock);std::cout << "service done" << std::endl;}struct Task{int _port;std::string _ip;int _sock;Task(int port, std::string ip, int sock):_port(port),_ip(ip),_sock(sock){}void Run(){Service(_ip, _port, _sock);}};
服务器类的核心代码如下:
void loop(){struct sockaddr_in peer;// 获取远端端口号和ip信息socklen_t len = sizeof(peer);_tp = new ThreadPool(THREAD_NUM);_tp->ThreadPoolInit();while (1){// 获取链接// sock 是进行通信的一个套接字_listen_sock 是进行监听获取链接的一个套接字int sock = accept(_listen_sock, (struct sockaddr*)&peer, &len);if (sock < 0){std::cout << "accept fail, continue accept" << std::endl;continue;}int peerPort = ntohs(peer.sin_port);std::string peerIp = inet_ntoa(peer.sin_addr);std::cout << "get a new link, [" << peerIp << "]:[" << peerPort<< "]"<< std::endl;Task* task = new Task(peerPort, peerIp, sock);_tp->Put(task);}}
注意几点变化:
推荐阅读
- 明日方舟2022夏日嘉年华限定卡池有哪些角色
- 华为p50是曲面屏吗_直屏和曲屏有什么区别
- 地下城起源版本浓缩的异界精髓用法和获得方式
- 孩子沉迷于游戏和手机,作父母的该怎么办(孩子沉迷游戏爸妈束手无策)
- 五 AIR32F103 FreeRTOSv202112核心库的集成和示例代码
- .Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
- usmile大理石和微泡哪款好_usmile微泡刷和大理石版对比
- 支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程
- 常用Python库整理
- 天玑800U和骁龙768g哪个好_天玑800U和骁龙768g对比