⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a_tcpecho_svr.cpp

📁 一个不错
💻 CPP
字号:
/* Copyright is licensed under GNU LGPL.                 by I.J.Wang 2006 TCP server for echo service Build: make a_tcpecho_svr*/#include "../src/wysockfile.h"#include "../src/wysockaddrinet4.h"#include "../src/wy_uty.h"#include <sys/types.h>#include <sys/resource.h>#include <sys/time.h>#include <sys/wait.h>#include <signal.h>#include <unistd.h>// SIGCHLD handler: wait until a child has exited.//static void sig_handle(int sig_num){ int status; while(::wait3(&status, WNOHANG, NULL)) {};};static WyRet echo_service_for(WySockFile& cli_sock, const WySockAddrINet4& cli_addr)try { WyStr rbuf; rbuf._reserve(1024); // loop until eof: read data from cli_sock into rbuf and write back to cli_sock for(;;) {   try {     cli_sock >> rbuf;     if(rbuf.size()==0) {       return(Ok);      // eof     }     cli_sock << rbuf;   }   catch(const WyByteFlow::Reply& e) {     if(e==Wym_EINTR) {       continue;     }     WY_THROW( WyRet(e) );   } } return(Ok);}catch(const WyRet& e) { Wy::cerr << Wy::wrd(e) << '\n'; WY_TERMINATE("WyRet error");}catch(...) { WY_TERMINATE("unknown throw type");};static const char* syntax= "[Syntax]$./a_tcpecho_svr port\n";int main(int argc, char* argv[])try { if(argc!=2) {   Wy::cout << syntax;   return(-1); } WyRet r; uint16_t port; // convert argv[1] to uint16_t and save into port if((r=Wy::_strnum(port,NULL,argv[1]))!=Ok) {   WY_THROW(r); } ::signal(SIGCHLD,sig_handle); // setup svr_msock as the master socket WySockFile svr_msock(PF_INET,SOCK_STREAM,0); const WySockAddrINet4 SvrAddr(INADDR_ANY,port); if((r=svr_msock.bind(SvrAddr))!=Ok) {   WY_THROW(r); } if((r=svr_msock.listen(0))!=Ok) {   WY_THROW(r); } // endless loop for(;;) {   WySockFile a_sock;   WySockAddrINet4 a_addr;   // accept an incoming socket and for a child process for it   if((r=svr_msock.accept(a_sock,a_addr))!=Ok) {     WY_THROW(r);   }   const ::pid_t cpid( ::fork() );   if(cpid==-1) {     WY_THROW( WyRet(errno) );   }   if(cpid==0) {     continue;   }   // Child process   //   svr_msock.reset();   // reset unused socket   if((r=echo_service_for(a_sock,a_addr))!=Ok) {     Wy::cerr << "Child process error: " << Wy::wrd(r) << '\n';     return(r->c_repcode());   }   return(0); } // UNREACHABLE return(0);}catch(const WyRet& e) { if(e!=Ok) {   Wy::cerr << Wy::wrd(e) << '\n'; } return e->c_repcode();}catch(...) { Wy::cerr << "main caught(...)\n"; return(-1);};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -