草庐IT

c# - 高性能套接字上的异步等待与线程池与多线程(C10k 解决方案?)

我对async-await、pool和thread真的很困惑。主要问题始于这个问题:“当我必须处理10k套接字I/O时我能做什么?”(又名TheC10kProblem)。首先,我尝试创建一个自定义的线程池架构它使用一个主Queue和多个Thread来处理所有传入数据。这是一次关于理解的很棒的经历thread-safety和multi-threading但thread是一个矫枉过正现在使用async-await。后来,我用async-await实现了一个简单的架构,但我无法理解为什么“async和await关键字不会导致要创建的额外线程。”(fromMSDN)?我认为有必须有一些thre

c# - 想要一个用于传入数据的 .Net 套接字事件处理程序

我正在用C#(.NetFramework4.0)重写一个古老的VB6程序。它与工厂车间的一台工业设备进行通信。VB6使用了一些旧的基于COM的套接字软件;我正在使用.NetSocket类。当我向设备发送一条消息时,我希望收到回复,这样我就知道要收听了。但是设备也可以在没有警告的情况下异步发送消息(例如,指示故障或问题)。所以我总是必须收到那些。所以我真正想要的是一个事件处理程序,只要设备有任何消息,它就会被调用。Socket类似乎使用BeginReceive/EndReceive方案来处理接收事件。我可以只在程序开始时执行一次BeginReceive来为所有传入消息定义事件处理程序,还

c# - 要关闭套接字,请不要 Close() 套接字。嗯?

我知道TIME_WAIT是TCP/IP不可或缺的一部分,但是关于每秒创建多个套接字并且服务器最终耗尽临时端口的SO(和其他地方)有很多问题。我发现,当使用TCPClient(或Socket)时,如果我调用Close()或Dispose()方法套接字的TCP状态更改为TIME_WAIT并在完全关闭之前遵守超时期限。但是,如果它只是将变量设置为null,套接字将在下一次GC运行时完全关闭,当然可以强制关闭,而无需经历TIME_WAIT状态。这对我来说意义不大,因为这是一个IDisposable对象,GC不应该也调用该对象的Dispose()方法?下面是一些演示这一点的PowerShell代

c# - Socket.Receive 什么时候返回数据?

又是初学者问题:有点像我不久前提出的问题的跟进。我正在尝试理解这个同步套接字教程http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx,尤其是下面代码中的一行。问题:我想确保我正确理解程序流程。什么时候handler.Receive(bytes)返回?当它“溢出”并接收到超过1024字节时,它是否返回并存储接收到的字节数在intbytesRec**中?**如果是这样的话,这听起来可能很愚蠢,如果在*data*变量中存储1024个字节而不是监听更多字节时到达更多字节会发生什么那可能会在那个时候到达?还是我不应该担心,让.net来处理?S

c#流收到所有数据?

我正在使用C#.Net和System.Net.Sockets命名空间中的Socket类。我正在使用异步接收方法。我知道这可以通过网络服务之类的东西更容易地完成;这个问题是出于好奇而不是实际需要。我的问题是:假设客户端正在发送一些未知长度的二进制序列化对象。在带有套接字的服务器上,我如何知道已接收到整个对象并准备好进行反序列化?我考虑过在对象前面加上对象的字节长度,但这在.Net世界中似乎是不必要的。如果对象大于缓冲区会发生什么?我怎么知道,“嘿,因为对象太大,必须调整缓冲区大小”? 最佳答案 您或者需要协议(protocol)是自终

c# - 由于线程退出或应用程序请求,I/O 操作已中止

我的应用程序用作银行服务器的客户端应用程序。该应用程序正在发送请求并从银行获得响应。此应用程序通常运行良好,但有时TheI/Ooperationhasbeenabortedbecauseofeitherathreadexitoranapplicationrequest错误代码为995。publicvoidOnDataReceived(IAsyncResultasyn){BLCommonFunctions.WriteLogger(0,"In:-OnDataReceived",refswReceivedLogWriter,strLogPath,0);try{SocketPackettheS

c# - 统一 : Live Video Streaming

我正在尝试将实时视频从一个应用程序流式传输到另一个应用程序,目前我有2个应用程序。app1是服务器/发送者,app2是客户端/接收者。在应用程序1中,我成功地将视频字节发送到客户端。在客户端,我也收到了所有的字节。我使用套接字和TCP。我面临的问题是,当我收到视频字节并将它们分配给原始图像纹理时,纹理上的图像看起来放大太多并且像素化。更新图片这是我的流这就是我在客户端上得到的。这是第一个问题,但是我目前正在从台式机到另一个进行测试,我的目标是将IPAD流式传输到台式机,当我这样做时,速度很慢,并且会同时杀死ipad和台式机上的应用程序。到目前为止我尝试过的一些故障排除。1:我认为这是因

c# - 在 .NET 中指定 UDP 多播应该转到的网络接口(interface)

在一台同时具有事件无线网卡和LAN端口并通过交叉电缆连接到另一台运行相同应用程序的计算机的计算机上,我们需要通过LAN线向另一台计算机发送UDP多播。使用C#套接字,Windows似乎每次都尝试通过WLAN适配器路由消息。有没有办法指定在哪个网络接口(interface)上发送UDP多播? 最佳答案 正如Nikolai回答的附录:KB318911的问题是一个肮脏的把戏,用户必须提供必要的适配器索引。在寻找如何检索此适配器索引时,我想出了这样的方法:NetworkInterface[]nics=NetworkInterface.Get

c# - 异步写入套接字线程安全吗?

考虑Socket.BeginSend()方法。如果两个线程池线程同时调用此方法,它们各自的消息最终会相互混合还是套接字类会阻止这种情况发生? 最佳答案 .NETSocket实例不是线程安全的,因为同时调用某些方法(相同或不同的方法)可能会导致状态不一致。但是,BeginSend()和BeginReceive()方法本身是线程安全的。对每个(或两者)进行多次未完成调用是安全的。在BeginReceive()的情况下,当数据以调用的顺序可用时,它们将被服务。例如,如果您的处理时间很长,但您希望其他接收尽快发生,这将很有用。当然,在这种情

c# - 如何使用套接字通过 Internet 发送数据?

我想通过桌面应用程序通过互联网发送数据。我对套接字略知一二。我已经在局域网内传输了数据,但现在我想通过互联网传输数据。传输大量和少量数据的最佳方式是什么?我的系统连接到可以访问互联网的服务器。我系统的IP地址是动态的。我不知道如何将数据发送到连接到互联网的另一个系统。我需要找到路由器地址吗?(我的IP地址生成为192.168.1.15)。使用套接字是否足够,还是需要HTTP? 最佳答案 如果不涉及防火墙/代理,套接字就足够了。但是,由于涉及到Internet(不是最快的连接),为了方便起见,我建议您最好选择通过http进行远程处理。