C#下用select方法实现socket服务端

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

select是一种比较古老但一直被证明性能很好的socket模式,它可以让你以消息驱动的模式书写socket程序。网上C++的例子很多,但C#的例子极少。

上代码:

namespace Server
{
    class Program
    {
        // Thread signal.
    public static ManualResetEvent allDone = new ManualResetEvent(false);

    private static Socket handler = null;
    private static ArrayList g_CliSocketArr = new ArrayList();
    private static Object thisLock = new Object();
    public Program()
    {
    }

    public static void StartListening() {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        
        IPAddress ipAddress = IPAddress.Parse("0.0.0.0");//0.0.0.0表示监听本机的所有IP
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );
        
        // Bind the socket to the local endpoint and listen for incoming connectio
c#网络通讯Select多路复用——小白笔记#8 一、关于Socket网络通讯,如果我们要同时监听多个客户端进行接收和发送消息时,直接使用Socket通讯的话就可能会出现其中一个Socket接收不到客户端发来的消息而阻塞而导致其他Socket阻塞,这就需要启用多个线程来监听每一个Socket,这样就会占用很多资源。为了解决这种问题,我们就要用到Select多路复用了,它能够同时监听多个Socket,如果一个Socket阻塞,其他Socket也能够正常运行,从而可以在一个线程中监听所有的Socket。为null时:一直阻塞直到前面三个发生变化时打开。 阅读详情

相关推荐

socket编程以及select、epoll、poll示例详解

socket编程socket这个词可以表示很多概念,在TCP/IP协议中“IP地址 + TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP + 端口号”就称为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么两个socket组成的socket pair就唯一标识一个连接。

Hyacinth_Dy 2万+

socket select函数用法,图文并茂讲解,初学者必备

Linux IO多路复用三剑客之select,图文并茂简介select实现原理和用法,初学者必备。

weixin_28673511的博客 3571

Socket.Select()函数使用不当引发的问题(关于套接字在线程间传递是否可行的验证)

使用环境:VS2010 C# 做东西的时候碰到一个问题: 在后台中,创建了一个监听线程,用来监听是否有连接到监听地址的请求,如果有,则加入监听套接字集中;(这样的话,一个线程就可以接收N个套接字的信息) 创建了一个接收线程,对监听套接字集中的套接字进行消息接收,并将该消息显示出来; 其中,监听套接字集中有与服务器连接的套接字srvCommSock 出错状况: 类似下图所示 即

白永辉的专栏 2383

socket select()用法

一、winsock中#include 原型int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,const struct timeval* timeout);nfds:本参数忽略,仅起到兼容作用。   readfds:(可选)指针,指向一组等待可读性检查的套接口。   writefds:(可选)

winson的专栏 2737

Unity3D 网络游戏框架(六、Select服务端Socket)

Select实现服务端

qq_39596597的博客 1423

select 实现socket服务器

借鉴了asyncore模块中select.select的使用方法 import socket import traceback import select EOL1 = b'\n\n' EOL2 = b'\n\r\n' socketmap = {} r,w,e = [],[],[] response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1

凡仔科技的专栏 818

select实现服务端程序

#define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <windows.h> #include <WinSock2.h> #include <stdio.h> #include <vector> #pragma comment(lib, "ws2_32.lib") enum CMD { CMD_LOGIN, CMD_LOGIN_RET, CMD.

u010874292的博客 256

简易TCP服务端升级为Select网络模型处理多客户端

简易TCP服务端升级为Select网络模型 这篇文章简单介绍了如何建立服务端与客户端1对1的阻塞模式网络程序,链接如下 服务端与客户端1对1网络程序 今天,我们来把这个TCP服务端升级为select模型非阻塞模式来处理多客户端,客户端不变。 具体的流程可以看下面这张图 服务端程序代码: // Server.cpp : Defines the entry point for the console application. // #include <iostream> #include &l

MagicScaring的博客 429

Unity 3D 笔记(十二)Unity/C# Socket 网络笔记1

本文系统讲解Socket网络编程核心知识,涵盖:1. Socket基础(IP/端口作用、长/短连接区分);2. 进程/线程/协程的区别与高并发应用;3. TCP三次握手/四次挥手;4. Log4Net日志持久化记录;5. Select多路复用机制优化性能;6. 客户端管理(字典存储、心跳包检测超时);7. UTC时间戳统一计时;8. 异常捕获保障服务稳定;9. 服务端架构(监听→处理→心跳清理循环)。适用于网游服务端开发,强调高效、稳定与可维护性,附代码片段与常见问题解决方案。

2301_80252792的博客 432

使用C#+socket实现用移动设备控制的虚拟手柄

近期在和同学玩死神vs火影,以怀念小时候,突然觉得用键盘玩的不够畅快,因此萌生了写一个虚拟手柄的念头。 我的思路是在移动设备(iOS、Android)上实现手柄,在电脑上监听,利用socket建立持久连接,通过移动设备向电脑上的监听软件发送操作码,通过操作码来处理事件。 现在已经完美实现了单键和组合键的操作,可以完美的代替键盘。 本文介绍的C#实现键盘事件与socket监听的方法

最美的时光 1900

c# socket接收字符串_Python3网络编程——socket编程之Tcp编程

1:Python3中socket编程介绍这里就不介绍网络编程的基础知识了,比如TCP/IP协议,OSI模型,TCP的三次握手等。下面直接介绍python中socket编程;2:简单的点对点只接受单个连接的服务端:01_TcpServer.py:# -*- coding: utf-8 -*- import socketimport time server = socket.socket()ip_po...

weixin_39670627的博客 106

网络游戏开发基础(二):Socket编程与聊天室案例

网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为一个Socket。一个Socket包含了进行网络通信必需的五种信息:连接使用的协议、本地主机的IP地址、本地的协议端口、远程主机的IP地址和远程协议端口。

qq_54476817的博客 1232

HP-Socket

HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装,上层应用不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到各类应用程序中;另外,为了让大家

u012129372的专栏 4997

c#使用基于select的多路复用模型实现本机聊天室

【代码】c#使用基于select的多路复用模型实现本机聊天室。

qq_73891209的博客 214

C#网络编程(六)----Socket编程模型

当数据就绪时,调用会立即返回读取的字节数(>0),不会阻塞线程。而Windows的IOCP在Windows NT 4.0 (1996年)就登上了历史舞台,加上C#起步较晚,没有历史包袱,所以对AIO支持力度更大,尤其是2012年发布了async/await异步模型后,解决了回调地狱,实现了1+1>3的效果。从代码中可以看出,有两个地方阻塞,一是Accept(),二是Receive(),如果客户端一直不发送数据,那么线程会一直阻塞在Receive()上,也不会接受其它客户端的连接。那么遍历的效率太过低下。

weixin_55010563的博客 612

C# 判断客户端socket 是否原生以及多路复用

网络五大io模型:阻塞io、非阻塞io、io多路复用、信号驱动模型(异步阻塞IO)、异步io((异步非阻塞IO)) 可以看之前的文章。

Marzlam的博客 634

[C#实战][Unity实战].net + unity全栈代码 [V1:Framework+Unity] [V2:Netty+Core+Unity](Socket支持protobuf)

net有诸多版本,所以简单实现Socket多线程的V1-Framework+Unity版本和V2-Core(Netty)+Unity版本。

学生董格 1099

Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3

本文核心内容包括:1. 消息处理体系:采用基类+Protobuf协议实体设计,支持反射自动分发消息,业务处理零耦合;2. 网络层架构:Select多路复用主循环管理连接生命周期,包含心跳检测、粘包处理等核心机制;3. 健壮性设计:UTC时间戳心跳检测、批量连接清理、Log4Net持久化日志等保障稳定性;4. 开发规范:统一消息命名规则、静态处理方法、客户端联调排错流程。技术亮点包括反射解耦业务、Select高性能IO处理、自动扩容缓冲区等,可作为网络编程教学模板,支持快速扩展登录、商城等业务模块。

2301_80252792的博客 494

C#使用Poll/Select实现多路I/O复用

在实际的应用中,如果全部采用异步的操作来,会增加代码的复杂程度,某些时候使用Poll/Select实现单线程多路的I/O复用会更合适一些。比起异步程序,代码简单的多,这是Read接收,还有发送SelectWrite。若没有收到客户端数据,服务端也一直在循环,浪费了CPU。商业上为了做 到性能上的极致,大多使用异步(或使用多线程模拟异步程序)。使用socket.Poll方法检查套接字是否有可读数据,超时时间为0,即立即返回 ,如果套接字有可读数据,则执行后续操作。checkError:检测是否有出错。

leikang111的博客 993
上一篇: SocketAsyncEventArgs 对象
下一篇: 国外程序员整理的 C++ 资源大全
键盘手老张
博客等级 码龄22年 42粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值