Tag: 套接字

TcpClient写入方法是否保证将数据传递给服务器?

我在客户端和服务器上都有一个单独的线程,它正在向/从套接字读取/写入数据。 我正在使用同步TcpClient im(如文档中所建议): https : //msdn.microsoft.com/cs-cz/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx 当连接关闭时.Read()/。Write()抛出exception。 是否意味着当.Write()方法没有将数据正确传递给另一方时,或者我是否需要实现自定义ACK逻辑 ? 我阅读了Socket和TcpClient类的文档,但没有一个描述这种情况。

如何监听多个IP地址?

如果我的服务器分配了多个IP地址,并且我想听一些(或全部)它们,我该怎么做呢? 我是否需要为每个IP地址创建一个新套接字并绑定它? 我可以将多个IP地址绑定到一个套接字吗? IPAddress.Any会监听所有IP地址吗? MSDN库在这个问题上非常不清楚。

是Socket。*异步方法是否有线程?

我目前正在尝试确定什么是最小化我在TCP主服务器中使用的线程数量的最佳方法,以便最大限度地提高性能。 由于我最近在使用C#5.0的新异步function阅读了很多内容,异步并不一定意味着multithreading。 它可能意味着在较小的有限状态对象块中分离,然后通过交替处理与其他操作一起处理。 但是,我不知道如何在网络中做到这一点,因为我基本上“等待”输入(来自客户端)。 因此,我不会对所有套接字使用ReceiveAsync(),它只是连续创建和结束线程(假设它确实创建了线程)。 因此,我的问题或多或少:主服务器可以在没有每个连接一个“线程”的情况下采用什么架构? 奖励酷点的一个问题:为什么multithreading坏了,考虑到拥有一定数量的线程超过你的处理内核数量只会使机器“假”multithreading,就像任何其他异步方法一样?

关于套接字的监听和积压的问题

我正在用C#编写一个需要处理传入连接的应用程序,之前我从未完成过服务器端编程。 这引出了以下几个问题: 高积压/低积压的利弊? 为什么我们不应该将积压设置为一个庞大的数字? 如果我调用Socket.Listen(10),在10 Accept()之后,我是否必须再次调用Listen()? 或者我必须在每次Accept()之后调用Listen()? 如果我将积压设置为0并且假设有两个人想要同时连接到我的服务器,会发生什么? (我在一个循环中调用Socket.Select并检查侦听套接字的可读性,在我处理第一个连接之后,如果我再次调用Listen(),第二个连接会在下一次迭代时成功吗?) 提前致谢。

如何在C#中检测套接字断开

我正在研究一种客户端/服务器关系,它意味着在不确定的时间内来回推送数据。 我试图克服的问题是在客户端,因为我无法找到检测断开连接的方法。 我已经在其他人的解决方案上进行了几次传递,从捕获IOexception到轮询所有三个SelectMode上的套接字。 我还尝试使用轮询的组合,并检查套接字的“可用”字段。 // Something like this Boolean IsConnected() { try { bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead); bool part2 = (this.Connection.Client.Available == 0); if (part1 & part2) { // Never Occurs //connection is closed return false; } return true; } catch( IOException e ) { // Never Occurs Either } } 在服务器端,尝试向客户端写入“空”字符(\ 0)会强制执行IOexception,服务器可以检测到客户端已断开连接(非常简单)。 在客户端,相同的操作不会产生exception。 […]

TcpListener排队连接的速度比我清除它们的速度快

据我了解,一旦调用Start() , TcpListener将对连接进行排队。 每次调用AcceptTcpClient (或BeginAcceptTcpClient )时,它都会从队列中取出一个项目。 如果我们通过立即向它发送1,000个连接来加载测试我们的TcpListener应用程序,那么队列构建的速度远远超过我们清除它的速度,导致(最终)从客户端超时,因为它没有得到响应,因为它的连接仍在队列。 然而,服务器似乎没有太大的压力,我们的应用程序没有消耗太多的CPU时间,并且机器上的其他受监控资源也没有出汗。 感觉我们现在还没有足够高效地运行。 我们调用BeginAcceptTcpListener然后立即切换到ThreadPool线程来实际完成工作,然后再次调用BeginAcceptTcpClient 。 所涉及的工作似乎没有对机器施加任何压力,它基本上只是一个3秒的睡眠,然后是字典查找,然后是100字节写入TcpClient的流。 这是我们使用的TcpListener代码: // Thread signal. private static ManualResetEvent tcpClientConnected = new ManualResetEvent(false); public void DoBeginAcceptTcpClient(TcpListener listener) { // Set the event to nonsignaled state. tcpClientConnected.Reset(); listener.BeginAcceptTcpClient( new AsyncCallback(DoAcceptTcpClientCallback), listener); // Wait for signal tcpClientConnected.WaitOne(); } public void DoAcceptTcpClientCallback(IAsyncResult ar) { // Get the listener […]

在Azure或亚马逊上托管控制台应用程序,是否可能?

我想知道是否可以在Windows Azure上将控制台应用程序写入端口 。 控制台应用程序没有接口,它只是在不通知用户正在做什么的情况下完成其工作。 在这种情况下,它将是一个套接字应用程序。 我不希望它成为一个网站。 它不会是项目的任何补充。 编辑:谢谢大家这么快回复我。 现在我得到了我一直在寻找的答案。 现在我的问题是: 它会在亚马逊上被称为什么? 它是Azure上的工作者角色…现在我知道感谢大家

使用System.Net.Sockets.Socket.AcceptAsync模型时堆栈溢出

对于C#和.NET的System.Net.Sockets.Socket.AcceptAsync方法,需要处理返回值“false”以便从同步处理的连接中处理立即可用的SocketAsyncEventArgs状态。 Microsoft提供了一些示例(可在System.Net.Sockets.SocketAsyncEventArgs类页面中找到),如果存在大量挂起连接,则会导致堆栈溢出,这可以在任何实现其处理模型的系统上利用。 解决此问题的其他想法是创建一个调用处理程序方法的循环,其条件是Socket.AcceptAsync返回的值等于false,并且如果值指示则中断循环(以允许延迟处理)该操作是异步完成的(true)。 但是,此解决方案还会导致堆栈溢出漏洞,因为与传递给Socket.AcceptAsync的SocketAsyncEventArgs相关联的回调在方法结束时,调用Socket.AcceptAsync ,它也有一个立即可用的循环,同步接受,连接。 正如您所看到的,这是一个非常可靠的问题,我还没有找到一个不涉及System.Threading.ThreadPool并创建大量其他方法和调度处理的好解决方案。 据我所知,与Socket.AcceptAsync相关的异步套接字模型需要的内容多于MSDN上的示例中所示。 有没有人有一个干净有效的解决方案来处理从Socket.AcceptAsync同步接受的立即挂起的连接,而无需创建单独的线程来处理连接而不使用递归?

ASP.NET Web App和C#Application之间的双向通信

我需要构建一个双向通信的网站和应用程序。 我将使用ASP.NET构建网站,并使用C#构建应用程序。 我将自己托管该网站,它将与应用程序在同一台机器上运行。 我不知道在两者之间发送数据的最佳技术是什么。 C#应用程序需要一直运行。 我应该构建一个C#控制台应用程序,然后隐藏控制台窗口吗? 或者其他类型的应用程序会更合适吗? 我一直在寻找网络,并找到了几个不同的建议,包括套接字,消息队列,远程处理和WCF。 一些指示将非常感激 – 我是所有这一切的新手。 谢谢。 编辑将使用请求 – 响应模式,Web App始终是实例化请求的模式。 这就是我所说的双向沟通​​。 Web应用程序将向后端应用程序发送请求,后端应用程序将执行一些处理,然后将响应发送回Web应用程序。 JSON将用于来回发送数据。 我将使用SQL Server Express 2008 R2,后端应用程序将是唯一与数据库通信的应用程序。 Web应用程序主要关注表示层。 后端应用程序将具有内存中的对象,这些对象在应用程序启动时实例化(数据从数据库加载),然后持久保存到数据库(执行期间和关闭之前)。 C#Console应用程序是否适用于此类事情?

C#通过socket发送结构对象

我在c#中用客户端/服务器编程做了一些阅读。 我对这个过程非常熟悉,可以提出以下问题: 我如何通过TCP / IP而不是字符串传输结构对象? 我的应用程序是一个具有聊天function的联网游戏。 所以我不想只传输文本,而是想要构建一个包含两个字段的数据结构或类结构:i。 包类型ii。 数据包类型的数据 我会在应用程序执行期间需要时传输它,并在接收端解码数据对象并将其放在它所属的位置。 我不寻找代码,只是一些想法和搜索语句,我可以提供给谷歌,所以我会; 有一个更好的理解。 香港专业教育学院阅读有关序列化/反序列化,是他的方式去? 谢谢。 我已经检查了相关主题的post,但仍然希望进一步指导。