自己做的类库 封装socket类 请问怎样实现非阻塞模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己做的类库 封装socket类 请问怎样实现非阻塞模式相关的知识,希望对你有一定的参考价值。

当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式。
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
u_long iMode = 1; //non-blocking mode is enabled.
ioctlsocket(m_socket, FIONBIO, &iMode); //设置为非阻塞模式

套接字设置为非阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。大多数情况下,这些函数调用都会调用“失败”,并返回WSAEWOULDBLOCK错误代码。说明请求的操作在调用期间内没有时间完成。通常,应用程序需要重复调用该函数,直到获得成功返回代码。 不同的Windows Sockets API函数,在调用失败时返回的WSAEWOULDBLOCK错误代码具有不同的含义
需要说明的是并非所有的 Windows Sockets API 在非阻塞模式下调用,都会返回 WSAEWOULDBLOCK 错误。例如,以非阻塞模式的套接字为参数调用 bind() 函数时,就不会返回该错误代码。当然,在调用 WSAStartup() 函数时更不会返回该错误代码,因为该函数是应用程序第一调用的函数,当然不会返回这样的错误代码。
要将套接字设置为非阻塞模式,除了使用 ioctlsocket() 函数之外,还可以使用 WSAAsyncselect() 和 WSAEventselect() 函数。当调用该函数时,套接字会自动地设置为非阻塞方式:
The WSAAsyncSelect function automatically sets socket s to nonblocking mode, regardless of the value of lEvent .
The WSAEventSelect function automatically sets socket s to nonblocking mode, regardless of the value of lNetworkEvents .
参考技术A 可以使用回调,或者事件的方式进行非阻塞处理。

NuGet学习笔记2——使用图形化界面打包自己的类库

NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新。在安装好NuGet扩展后,我们已经能够通过NuGet轻松下载自己需要的类库,下面来说一说如何将自己的项目类库进行打包发布

使用图形界面打包自己的类库

NuGet可以使用NuGet.exe在命令行下进行类库打包,也可以使用图形化界面进行打包,估计很多朋友都和我一样对不熟悉的命令行有些感冒,所以在此仅讲述下使用图形化界面进行类库打包

1.首先下载 包包管理器 NuGetPackageExplorer,顾名思义,包包管理器可以用来创建新的类库包,也可以浏览已经创建好的类库包

2.下载完成后,双击 NuGetPackageExplorer.application 进行安装,安装完成后会在桌面上生成一个NuGet Package Explorer 的快捷方式

技术分享 技术分享

3.双击NuGet Package Explorer出现启动界面,选择Create a new package(Ctrl+N)创建一个新包

技术分享

技术分享

4.选择菜单 Edit > Edit Package Metadata (或者 CTRL + K) 编辑包包信息
  这里可以编辑类库包的信息和添加类库、程序集的引用解释下几个比较重要的字段
  Id:用于定位类库包的唯一标示,如在命令行下执行 Install-Package MyPackage 这里的MyPackage就是包包的Id值
  Version:类库的版本号,这里建议和程序集的真实版本号保持一致,以免发生混淆
  Dependencies:此类库依赖的程序集,根据实际情况添加依赖类库的Id和版本号,若无留空即可,这里需要注意下填写的依赖类库需要在NuGet服务器上能找到,否则无法完成自动引用添加
  Framework assemblies:依赖的Framework 程序集,根据实际需要选择即可,一般无需设置

  除以上四项以外其他属性根据实际情况修改即可,若自己用不修改也中,不过为了使用方便还是建议把类库描述(Description)填写下

技术分享

5.编辑好包包信息后接下来添加DLL到包包中
  可以选择 右键-->Add Existinng File... 选择dll添加,也可以直接拖拽DLL到 Package contents 窗口,此例选择拖拽方式

  直接拖拽dll到窗口后,会出现提示:是否将 Winista.HtmlParser.dll放到lib 文件夹下,一般我们选择是
  

技术分享

 

6.DLL添加完成后,快捷键Ctrl + K 修改包包信息Id为Winista.HtmlParser,版本号为1.8.0

技术分享

7.信息修改和dll都添加完毕后,选择File --> Save(或Ctrl + S)将文件进行保存,默认文件名为Id + 版本号.nupkg

技术分享

8.完成保存后如需要发布到网上,选择File--> Publish...(或Ctrl + P)
  默认的发布地址是官网,发布 Key需要到官网去注册一个账号,然后就可以得到,这里不在复述,若无需发布直接关闭即可

技术分享

 

ps:这里没有讲述如何打包项目文件,一般情况下我们自己将项目文件编译成DLL然后使用图形化界面打包即可满足需求,若实际工作需要高度集成完全自动化操作可自行去研究下官方文档http://docs.nuget.org/

添加DLL默认会添加Lib文件夹,额外的菜单上还有很多.net文件夹,src等文件夹,这些文件夹只是对文件上的一个物理上的划分而已,只是为了帮助我们做好文件分类,没有其他的用途,dll文件可以随便放置,不过为了规范还是建议按照通常习惯来放置。

以上是关于自己做的类库 封装socket类 请问怎样实现非阻塞模式的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个类库封装成DLL?

JavaScript-创建第一个自己的类库

在vs2015怎样调用一个类库

使用图形化界面打包自己的类库

NuGet学习笔记2——使用图形化界面打包自己的类库

如何理解js框架与js类库的不同?