热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Select模型服务器框架

头文件InitServerSocket.h#pragmaonceclassCInitServerSocket{public:CInitServerSocket();~CI

头文件 InitServerSocket.h

```
#pragma once
class CInitServerSocket
{
public:
CInitServerSocket();
~CInitServerSocket();
CInitServerSocket(USHORT nPort, char * szIpAddr);
private:
// //端口号
USHORT m_nPort;
// //监听套接字
SOCKET m_sSocket;
// //主机地址
char *m_szIpAddr;`这里写代码片`protected:
bool InitSocket();
private:
bool SelectFrm();
public:
virtual bool HandRecv(SOCKET sSocket, char * pszRecv) = 0;
};

void ShowNetworkError(const char *szDetail);


#include "stdafx.h"
#include "InitSocket.h"
#pragma warning(disable:4996)CInitServerSocket::CInitServerSocket(): m_szIpAddr(NULL)
{
}CInitServerSocket::~CInitServerSocket()
{WSACleanup();
}bool CInitServerSocket::InitSocket()
{m_sSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == m_sSocket){ShowNetworkError("Create sListen");return false;}SOCKADDR_IN saiServer;saiServer.sin_family = AF_INET;saiServer.sin_port = htons(m_nPort);saiServer.sin_addr.S_un.S_addr = (m_szIpAddr == NULL ? INADDR_ANY : inet_addr(m_szIpAddr));if (SOCKET_ERROR == ::bind(m_sSocket, (LPSOCKADDR)&saiServer, sizeof(saiServer))){ShowNetworkError("bind sListen");return false;}if (SOCKET_ERROR == ::listen(m_sSocket, 5)){ShowNetworkError("Listen");return false;}
}void ShowNetworkError(const char *pszDetail)
{DWORD dwError = GetLastError();HLOCAL hLocal = NULL;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL, dwError, MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED),(TCHAR *)&hLocal, 0, NULL);if (!hLocal){printf("%s Error:\n", pszDetail);printf("Error No. %d: dwError");printf("Error Info %s \n", LocalLock(hLocal));}
}CInitServerSocket::CInitServerSocket(USHORT nPort, char * szIpAddr = NULL)
{WSADATA wd;WSAStartup(MAKEWORD(2, 2), &wd);m_nPort = nPort;m_szIpAddr = m_szIpAddr;InitSocket();
}bool CInitServerSocket::SelectFrm()
{fd_set fdSocket;FD_ZERO(&fdSocket);FD_SET(m_sSocket, &fdSocket);while (true){fd_set fdRead = fdSocket;int nRet = select(0, &fdRead, NULL, NULL, NULL);if (nRet > 0){for (int i = 0; i .fd_count; i++){if (FD_ISSET(fdSocket.fd_array[i], &fdRead)){if (fdSocket.fd_array[i] == m_sSocket){if (fdSocket.fd_count > FD_SETSIZE){printf("Too Much Connect\n");}else{SOCKADDR_IN sai;int nLen = sizeof(sai);SOCKET sNew = accept(m_sSocket, (LPSOCKADDR)&sai, &nLen);if (INVALID_SOCKET == sNew){ShowNetworkError("Accept");continue;}else{printf("收到(%s)的连接\n", inet_ntoa(sai.sin_addr));FD_SET(sNew, &fdSocket);}}}//if (fdSocket.fd_array[i] == m_sSocket)else{char szBuf[255] = "";int nRecv = recv(fdSocket.fd_array[i], szBuf, 255, 0);if (nRecv > 0){//HandRecv(fdSocket.fd_array[i], szBuf);}else{closesocket(fdSocket.fd_array[i]);FD_CLR(fdSocket.fd_array[i], &fdSocket);}}}}}}return TRUE;
}


推荐阅读
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
author-avatar
书友40416624
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有