📄 a_tcpecho_svr.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 + -