当前位置: 首页 > news >正文

免费推广网站工具网站留言系统 提交没反应

免费推广网站工具,网站留言系统 提交没反应,wordpress vs zencart,沈阳个人做网站本文搭建一个Unix环境下的、局域网内的、简易的本地时间获取服务。 主要用于验证#xff1a; 当TCP连接成功后#xff0c;可以在两个线程中分别进行读操作、写操作动作当客户端自行终止连接后#xff0c;服务端会在写操作时收到 SIGPIPE 信号当客户端执行shutdown写操作后 当TCP连接成功后可以在两个线程中分别进行读操作、写操作动作当客户端自行终止连接后服务端会在写操作时收到 SIGPIPE 信号当客户端执行shutdown写操作后客户端会在写操作时收到 SIGPIPE 信号当客户端执行shutdown写操作后服务端会在读操作时得到返回值 0 服务端功能 轮询监听Client的连接阻塞式创建并缓存会话对象开启会话对象的读操作线阻塞式IO、写操作线程阻塞式IO当读写操作线程退出时通过回调来执行资源释放fd会话对象 客户端功能 连接成功后直接开启读操作线程阻塞式IO、写操作线程阻塞式IO在2秒后shutdown写端在3秒后退出工作线程 (本文对打印进行了加锁确保输出信息看起来更清晰否则信息会混乱交错)  服务端源码局域网ip、端口port 按需自行修改噢 // TimeServer.cpp#include iostream #include thread #include vector #include map #include atomic #include exception #include unistd.h #include sys/socket.h #include arpa/inet.h#include TimeConn.hppstd::mapint, TimeConn conn_map;int initServer(const std::string ip, uint16_t port) {int server socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (server -1) {std::cout socket failed, errno: strerror(errno) std::endl;_exit(0);}sockaddr_in addr{.sin_family AF_INET,.sin_port htons(port)};int success inet_pton(AF_INET, ip.c_str(), addr.sin_addr);if (success 0) {std::cout invalid ip address, errno: strerror(errno) std::endl;_exit(0);} else if (success -1) {std::cout inet_pton error, errno: strerror(errno) std::endl;_exit(0);}success bind(server, reinterpret_castconst sockaddr*(addr), sizeof(sockaddr_in));if (success -1) {std::cout bind failed, errno: strerror(errno) std::endl;_exit(0);}success listen(server, 50);if (success -1) {std::cout listen failed, errno: strerror(errno) std::endl;_exit(0);}return server; }void handleConn(int conn) noexcept(false) {sockaddr client_addr;socklen_t len sizeof(decltype(client_addr));// 读取连接建立时client的信息auto success getpeername(conn, client_addr, len);if (success 0) {if (client_addr.sa_family AF_INET) {sockaddr_in* ipv4 reinterpret_castsockaddr_in*(client_addr);std::cout client ip: std::hex ipv4-sin_addr.s_addr std::dec port: ipv4-sin_port std::endl;}} else if (success -1) {std::cout getpeername failed, errno: strerror(errno) std::endl;close(conn);return;}TimeConn timeConn conn_map[conn];timeConn.initConnFd(conn);timeConn.startRead([timeConn](int conn_fd){if (timeConn.canClose()) {close(conn_fd);conn_map.erase(conn_fd);}});timeConn.startWrite([timeConn](int conn_fd){if (timeConn.canClose()) {close(conn_fd);conn_map.erase(conn_fd);}}); }int main(int argc, char* argv[]) {std::cout Hello, I am server std::endl;std::string ip{192.168.0.110};auto server initServer(ip, 10080);while (true) {std::cout Server accepting... std::endl;int conn accept(server, nullptr, nullptr);if (conn -1) {if (errno EAGAIN) {continue;} else {std::cout accept failed, errno: strerror(errno) std::endl;_exit(0);}}std::cout new connect! conn fd: conn std::endl;try {handleConn(conn);} catch (std::exception e) {// std::cout handleConn exception: e.what() std::endl;}}close(server);return 0; } 服务端会话源码 // TimeConn.hpp#ifndef __TIMECONN_HPP__ #define __TIMECONN_HPP__#include unistd.h #include atomic #include threadclass TimeConn { public:TimeConn(int conn -1) : mConnFd{conn}, isReading{false}, isWriting{false}{// ...};virtual ~TimeConn(){close(mConnFd);};// constexpr TimeConn operator(const TimeConn );public:void initConnFd(int conn);void startRead(std::functionvoid(int) callback);void startWrite(std::functionvoid(int) callback);void stopRead();void stopWrite();bool canClose();private:int mConnFd;std::atomic_bool isReading;std::atomic_bool isWriting; };#endif // TimeConn.cpp#include chrono #include iostream #include mutex #include sstream #include sys/socket.h #include signal.h#include TimeConn.hpp// constexpr TimeConn TimeConn::operator(const TimeConn other) { // this-mConnFd other.mConnFd; // return *this; // }static std::mutex m;static void print_log(const std::stringstream ss) {std::lock_guardstd::mutex lock(m);std::cout ss.str() std::endl; }void TimeConn::initConnFd(int conn) {this-mConnFd conn; }void TimeConn::startRead(std::functionvoid(int) callback) {using namespace std::literals;isReading true;std::thread([this, callback]{std::stringstream ss;ss conn fd: this-mConnFd start read;print_log(ss);while (this-isReading) {char buffer[512];ssize_t res recv(this-mConnFd, buffer, sizeof(buffer), 0);if (res 0) {std::stringstream ss1;ss1 no data or remote end;print_log(ss1);break;} else if (res -1) {// errorstd::stringstream ss2;ss2 conn fd: this-mConnFd recv failed: strerror(errno);print_log(ss2);break;} else {std::stringstream ss3;ss3 recv success, count: res data: buffer;print_log(ss3);}}this-isReading false;callback(this-mConnFd);// 注意// 在经过callback后若map进行了erase操作则该TimeConn obj内存被清除this-mConnFd值是不确定的大概率是0但也可能已被其它值占用std::stringstream ss4;ss4 conn fd this-mConnFd Reading finish;print_log(ss4);}).detach(); }void TimeConn::startWrite(std::functionvoid(int) callback) {using namespace std::literals;isWriting true;std::thread([this, callback]{std::stringstream ss;ss conn fd: this-mConnFd start write;print_log(ss);// send 时若该连接已关闭则会产生SIGPIPE信号程序默认执行动作是“退出进程”// 解决方案一 使用signal忽略SIGPIPE// signal(SIGPIPE, SIG_IGN);while (this-isWriting) {const auto now std::chrono::system_clock::now();const std::time_t t_c std::chrono::system_clock::to_time_t(now);const auto* t std::ctime(t_c);ssize_t res -1;// 发送数据// send 时若该连接已关闭则会产生SIGPIPE信号程序默认执行动作是“退出进程”// 解决方案二(操作系统受限) 若操作系统支持可以加上flag MSG_NOSIGNALres send(this-mConnFd, t, strlen(t) sizeof(\0), MSG_DONTROUTE | MSG_NOSIGNAL);if (res -1) {// errorstd::stringstream ss1;ss1 conn fd: this-mConnFd send failed: strerror(errno);print_log(ss1);break;} else {std::stringstream ss2;ss2 send success, count: res data: t;print_log(ss2);}// std::this_thread::sleep_for(1s);}this-isWriting false;callback(this-mConnFd);// 注意// 在经过callback后若map进行了erase操作则该TimeConn obj内存被清除this-mConnFd值是不确定的大概率是0但也可能已被其它值占用std::stringstream ss3;ss3 conn fd this-mConnFd Writing finish;print_log(ss3);}).detach(); }void TimeConn::stopRead() {isReading false; }void TimeConn::stopWrite() {isWriting false; }bool TimeConn::canClose() {// 鉴于该示例启动线程的时机与退出线程的时机比较简单所以无需加锁return !isReading !isWriting; } 本文中使用的recv、send函数都是用阻塞式IO所以相应的返回值处理都是按照阻塞式时的错误来进行处理的。若采用非阻塞式IO则处理方式并不是如此的。
http://www.pierceye.com/news/242350/

相关文章:

  • 图书管理系统网站开发教程北京今朝装饰设计有限公司
  • 济南咨询行业网站开发qq降龙是哪个公司开发的
  • 可以做go分析的网站网站如何做营销
  • 企业网站设计要求做公司网站的价格
  • 网站建设与管理中专专业网页设计公司营销crm系统
  • wordpress全站甘肃省住房和城乡建设厅安置局网站
  • 做视频网站应该选什么服务器十大暗网搜索引擎
  • 建立外贸网站多少钱淮北招聘网最新招聘信息
  • 有做浏览单的网站jsp网站开发过程
  • 做网站用小型机或服务器wordpress 喜欢
  • 网站建设与维护采访稿中国建设银行电脑版
  • 企业网站建设变相收取等级保护费手游平台十大排名
  • 影响力网站建设恩施网站开发
  • 美术馆网站建设总体要求承德信息发布微信平台
  • 同城便民网站开发为什么企业需要建设网站
  • 网站制作推荐新鸿儒黄山游玩攻略及费用
  • 二手车网站的建设app与微网站的区别是什么
  • 深圳做棋牌网站建设哪家便宜网站域名更改后怎么做映射
  • 长沙网站seo公司知名网站设计服务商
  • 网站建设会议讲话lol视频网站源码
  • 深圳市哪些公司做网站好wordpress小插件下载地址
  • 佛山优化网站公司网站策划书格式及范文
  • 上海网站建设公司秦皇岛网站seo
  • 外贸网站推广 sit淮安市广德育建设网站
  • 准备建网站该怎么做淘宝店铺
  • 1688外贸网站国外购物网站哪个最好
  • 怎么修改网站关键词网站建设的地方
  • 江苏运营网站建设业务淘宝推广引流方法有哪些
  • 快手评论点赞网站建设专业分站微信小程序开发者中心
  • mvc5网站开发之六 管理员p2网站模板