#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是曲面屏吗_直屏和曲屏有什么区别
- 馅饼的做法怎么和面
- 2023年9月7日开鱼池吉日一览表 2023年9月7日开鱼池行吗
- 2023年9月7日挖掘池塘吉日一览表 2023年9月7日适合挖掘池塘吗
- 孩子沉迷于游戏和手机,作父母的该怎么办(孩子沉迷游戏爸妈束手无策)
- 2023年9月7日是建蓄水池吉日吗 2023年农历七月廿三宜建蓄水池吗
- 2023年9月7日是池塘放水吉日吗 2023年9月7日适合池塘放水吗
- 蜂鸟的寓意和象征