All Projects → qchencc → WinsockTut

qchencc / WinsockTut

Licence: Apache-2.0 license
Winsock programming tutorial and examples with different I/O strategy

Programming Languages

C++
36643 projects - #6 most used programming language
go
31211 projects - #10 most used programming language
c
50402 projects - #5 most used programming language
CMake
9771 projects

Projects that are alternatives of or similar to WinsockTut

ctsTraffic
ctsTraffic is a highly scalable client/server networking tool giving detailed performance and reliability analytics
Stars: ✭ 125 (+346.43%)
Mutual labels:  winsock
mt4-tcp
Winsock bindings for MetaTrader 4 platform
Stars: ✭ 24 (-14.29%)
Mutual labels:  winsock
khudro
Khudro is a very light weight web-server built with C.
Stars: ✭ 19 (-32.14%)
Mutual labels:  winsock
connect
tiny cross-platform socket API library
Stars: ✭ 46 (+64.29%)
Mutual labels:  winsock
Malware-Collection
Source codes of malwares, stress tests etc. for computer.
Stars: ✭ 27 (-3.57%)
Mutual labels:  winsock
nhn next gameserver lab 2017 chatServer
NHN Next의 2017년 게임서버 과정 수업에 사용할 채팅 서버. select 기반
Stars: ✭ 32 (+14.29%)
Mutual labels:  winsock

WinsockTut

尝试使用不同的WindowsI/O多路复用模型编写网络测试代码。

这是我在阅读Windows网络编程后的实践项目

Overview

I/O Model Source File Description
select() poller src/SelectPoller.cpp Linux和Windows都支持的API,大多数的跨平台网络库都会采用
WSAAsyncSelect() poller src/AsyncSelectPoller.cpp 网络事件挂接到HWND消息
WSAEventSelect() poller src/AsyncEventPoller.cpp 通过事件对象接收网络事件通知,64限制
Alertable I/O N/A 本代码尚未实现
Overlapped I/O src/OverlappedIOService.cpp 重叠I/O,也是通过事件对象接收网络事件通知,也有64限制,鸡肋
I/O Completion Port src/CompletionPortService.cpp Windows下性能最好的网络I/O多路复用模型

Introduction

所有的网络多路复用根据使用方式分别采用ReactorProactor的方式,做了简单抽象,根据简单的参数应用层示例即可选择不同的模型。

Reactor

select, WSAAsyncSelect和WSAEventSelect采用了Reactor模型,API设计参考了zeromq 如下所示:

class PollerBase 
{
    int AddFd(SOCKET fd, IPollEvent* event);    // 添加一个套接字fd到事件循环
    void RemoveFd(SOCKET fd);                   // 从事件循环中删除一个套接字fd
    void SetPollIn(SOCKET fd);                  // 设置关注套接字的读事件
    void ResetPollIn(SOCKET fd);                // 设置取消关注套接字的读事件
    void SetPollOut(SOCKET fd);                 // 设置关注套接字的写事件
    void ResetPollOut(SOCKET fd);               // 设置取消关注套接字的写事件
    int Poll(int timeout);                      // 事件循环
}

Proactor

I/O Completion Port和Overlapped I/O采用Proactor模型,API设计参考了boost.asio

如下所示:

class IOServiceBase
{
    int AsyncConnect(OverlapContext* ctx, const addrinfo*); // 连接一个addrinfo指定的地址, ctx中指定回调
    int AsyncAccept(OverlapContext* ctx);                   // accpet一个新套接字fd, ctx中指定回调
    int AsyncRead(OverlapContext* ctx);                     // 异步读网络数据, ctx中指定回调
    int AsyncWrite(OverlapContext* ctx);                    // 异步写网络数据, ctx中指定回调
    int Run(int timeout);                                   // 事件循环
}

如何构建

  • 安装Visual Studio
  • 安装CMake
  • 使用CMake生成Visual Studio工程文件
  • 使用Visual Studio打开工程

Example

使用Reactor模型的echo示例

echo示例

使用Proactor模型的ping/pong示例

pingpong示例

测试

tests目录下是用golang实现的echo server和echo client

备注

本代码仅作学习参考或者教学目的

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].