新媒体包不包括公司网站的建设,推荐医疗网站建设,网站怎么做伪静态iis7.0,成华区网站建设公司打算把 tinyWebServer 重写成跨平台#xff08;Windows and Linux#xff09;的。
这里首先需要跨平台的 sokcet#xff0c;主要参考 尹圣雨 的 TCP/IP 网络编程 来着#xff1a;
代码写的有些笨#xff0c;欢迎批评#xff1a;
首先是一个 socket 类#xff0c;主要…打算把 tinyWebServer 重写成跨平台Windows and Linux的。
这里首先需要跨平台的 sokcet主要参考 尹圣雨 的 TCP/IP 网络编程 来着
代码写的有些笨欢迎批评
首先是一个 socket 类主要封装了 常用操作通过宏定义分别针对 Linux 和 Windows 处理
#ifndef _SOCKET_H_
#define _SOCKET_H_#ifdef _WIN32
#include winsock2.h
#else
#include sys/socket.h
#include netinet/in.h
#include fcntl.h
#include unistd.h
#include arpa/inet.h
#endif#include cstdio
#include cstring
#include cstdlib#include iostream
#include sstream
#include exception
#include stdexcept
#include string#ifdef _WIN32using socklen_t int;
#elseusing SOCKET int; //文件描述符static constexpr int INVALID_SOCKET -1; static constexpr int SOCKET_ERROR -1;
#endifclass Socket {public:Socket():Socket(PF_INET,SOCK_STREAM,IPPROTO_TCP){}Socket(int domain, int type, int protocal);Socket(SOCKET socket): m_socket(socket){}~Socket() noexcept;void bind(sockaddr *addr, socklen_t addrlen);void listen(int queueLen 5);Socket accept(sockaddr *addr, socklen_t *addrlen);void connect(sockaddr *addr, socklen_t len);SOCKET getSocket() { return m_socket; }private:SOCKET m_socket;
};class WinSockMgr {
public:static WinSockMgr *getInstance() {static WinSockMgr instance;return instance;}
private:WinSockMgr();~WinSockMgr() noexcept;
};#endif这里 WinSockMgr 主要用来管理 WinSock 的一些启动销毁工作。
然后是实现这里直接报错就抛异常
#include socket.hnamespace {
#ifdef _WIN32WinSockMgr* winSockMgr WinSockMgr::getInstance();
#endif
}std::string getErrorStr(const char *str)
{std::ostringstream errStr;errStr str with errno [ errno ];return errStr.str();
}Socket::Socket(int domain, int type, int protocal) try //这里的 try 纯属多此一举
{m_socket socket(domain,type,protocal);if (INVALID_SOCKET m_socket) {std::string errStr getErrorStr(socket() failed!);std::cerr errStr std::endl;throw std::runtime_error(errStr);}
} catch(const std::runtime_error e) {throw;
}Socket::~Socket()
{
#ifdef _WIN32if (0 ! closesocket(m_socket)) {std::cerr closesocket() failed! std::endl;}
#elseclose(m_socket);
#endif
}void Socket::bind(sockaddr *addr,socklen_t len)
{if (0 ! ::bind(m_socket,addr,len)) {std::string errStr getErrorStr(bind() failed!);std::cerr errStr std::endl;throw std::runtime_error(errStr);}
}// queueLen 5
void Socket::listen(int queueLen)
{// 第二个参数是 请求等待的数量if (0 ! ::listen(m_socket,queueLen)) {std::string errStr getErrorStr(listen() failed!);std::cerr errStr std::endl;throw std::runtime_error(errStr);}
}Socket Socket::accept(sockaddr *addr, socklen_t *addrlen)
{SOCKET socket ::accept(m_socket,addr,addrlen);if (INVALID_SOCKET socket) {std::string errStr getErrorStr(accept() failed!);std::cerr errStr std::endl;throw std::runtime_error(errStr);}return Socket{socket};
}void Socket::connect(sockaddr *addr, socklen_t addrlen)
{if (SOCKET_ERROR ::connect(m_socket,addr,addrlen)) {std::string errStr getErrorStr(connect() failed!);std::cerr errStr std::endl;throw std::runtime_error(errStr);}
}WinSockMgr::WinSockMgr() {
#ifdef _WIN32WSADATA wsaData;int ret WSAStartup(MAKEWORD(2,2),wsaData);if (ret ! 0) {std::string errStr getErrorStr(WSAStartup() failed!);std::cerr errStr with return: [ ret ] std::endl;throw std::runtime_error(errStr);}
#endif
}WinSockMgr::~WinSockMgr() {
#ifdef _WIN32if (0 ! WSACleanup()) {std::string errStr getErrorStr(WSACleanup() failed!);std::cerr errStr std::endl;}
#endif
}代码写的不够简洁还需要修改但是先这样吧。
主要是简单的封装也没啥好讲的。 文章转载自: http://www.morning.mbbgk.com.gov.cn.mbbgk.com http://www.morning.mgbsp.cn.gov.cn.mgbsp.cn http://www.morning.wzwyz.cn.gov.cn.wzwyz.cn http://www.morning.hpdpp.cn.gov.cn.hpdpp.cn http://www.morning.divocn.com.gov.cn.divocn.com http://www.morning.jydky.cn.gov.cn.jydky.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.mtbth.cn.gov.cn.mtbth.cn http://www.morning.qrsrs.cn.gov.cn.qrsrs.cn http://www.morning.ryxbz.cn.gov.cn.ryxbz.cn http://www.morning.wlfxn.cn.gov.cn.wlfxn.cn http://www.morning.zrkws.cn.gov.cn.zrkws.cn http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.qglqb.cn.gov.cn.qglqb.cn http://www.morning.hyfrd.cn.gov.cn.hyfrd.cn http://www.morning.jxdhc.cn.gov.cn.jxdhc.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.rdtp.cn.gov.cn.rdtp.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.czlzn.cn.gov.cn.czlzn.cn http://www.morning.klrpm.cn.gov.cn.klrpm.cn http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn http://www.morning.zhnpj.cn.gov.cn.zhnpj.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.qrndh.cn.gov.cn.qrndh.cn http://www.morning.sgnjg.cn.gov.cn.sgnjg.cn http://www.morning.lxlfr.cn.gov.cn.lxlfr.cn http://www.morning.hwbf.cn.gov.cn.hwbf.cn http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn http://www.morning.dyxlj.cn.gov.cn.dyxlj.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.qpsft.cn.gov.cn.qpsft.cn http://www.morning.dtrcl.cn.gov.cn.dtrcl.cn http://www.morning.rpwht.cn.gov.cn.rpwht.cn http://www.morning.jbtlf.cn.gov.cn.jbtlf.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.fpkdd.cn.gov.cn.fpkdd.cn http://www.morning.jfbrt.cn.gov.cn.jfbrt.cn http://www.morning.ybyln.cn.gov.cn.ybyln.cn http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.rbjf.cn.gov.cn.rbjf.cn http://www.morning.slqzb.cn.gov.cn.slqzb.cn http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn http://www.morning.jbblf.cn.gov.cn.jbblf.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn http://www.morning.fkdts.cn.gov.cn.fkdts.cn http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn http://www.morning.cqwb25.cn.gov.cn.cqwb25.cn http://www.morning.cpkcq.cn.gov.cn.cpkcq.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.bzjpn.cn.gov.cn.bzjpn.cn http://www.morning.ntqlz.cn.gov.cn.ntqlz.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.c7501.cn.gov.cn.c7501.cn http://www.morning.kfclh.cn.gov.cn.kfclh.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.hsjfs.cn.gov.cn.hsjfs.cn http://www.morning.hxycm.cn.gov.cn.hxycm.cn http://www.morning.mxhys.cn.gov.cn.mxhys.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.dangaw.com.gov.cn.dangaw.com http://www.morning.nhzzn.cn.gov.cn.nhzzn.cn http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.ghkgl.cn.gov.cn.ghkgl.cn http://www.morning.wkrkb.cn.gov.cn.wkrkb.cn http://www.morning.rhmk.cn.gov.cn.rhmk.cn http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn