Tag: asyncsocket

偶发TCP连接失败(WSAEHOSTUNREACH)

在本地千兆网络上,我有一个使用单个TCP服务器和许多客户端的应用程序。 每个客户端每30秒ping一次服务器,打开TCP连接,发送状态消息,然后关闭。 使用SocketAsyncEventArgs设置服务器的方式与此处显示的示例非常相似(为简洁起见,省略) 客户端使用TcpClient启动连接。 客户代码的相关部分: using (TcpClient client = new TcpClient()) { IAsyncResult ar = client.BeginConnect(address, port, null, null); if (!ar.AsyncWaitHandle.WaitOne(timeout)) { throw new ApplicationException(“Timed out waiting for connection to ” + address); } client.EndConnect(ar); //exception thrown 5%-10% of the time //…send message and receive response… } 一切正常,除了在某些机器上,在EndConnect上只有5%-10%的时间抛出exception。 例外是WSAEHOSTUNREACH (10065): System.Net.Sockets.SocketException (0x80004005): A socket operation […]

连接建立后如何从Server(使用连接列表)向Client发送命令?

我将这两个类作为我的服务器应用程序(桌面)的一部分,并且需要在建立连接后将命令发送回客户端。 当我尝试这样做: clients[i].Send(“info”); Send()例程( Listener.cs )是可访问的,但我有以下sintaxe错误: 怎么解决这个? Listener.cs using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; class Listener { Socket s; string IP; public List clients; public delegate void ReceivedEventHandler(Listener l, Info i, string received); public event ReceivedEventHandler Received; public delegate void DisconnectedEventHandler(Listener l, Info i); public event DisconnectedEventHandler Disconnected; bool listening = […]

使用C#中的异步套接字在任何给定时间将消息发送回客户端列​​表

我已经设置了异步服务器,它通过连接,接收和发送消息到连接客户端完美地工作。 服务器本身是游戏世界服务器(mmorpg风格)。 当用户将其位置发送到其所在的位置时,我需要使用PlayerPositionNotice将其推送到所有客户端。 我知道我在这里缺少一些基本的东西,但是当我尝试保存在accept方法中创建的StateObject,并使用该套接字在任何给定时间将信息发送回播放器时它会因套接字关闭而失败。 = /不知道为什么会发生这种情况,我会在这个问题上搜索几个引擎但是又回来了。 这就是我创建服务器的方式: 首先,我们有全球性的东西: public StateManager _stateManager = new StateManager(); public bool IsClosing = false; private const int _port = 1025; private IPHostEntry _localhost; private IPEndPoint _endpoint; private Socket _serverSocket; private Thread _serverThread; 第二个我们有初始化的东西: public void Start() { _serverThread = new Thread(Initialize); _serverThread.Start(); } /// /// Main entry point for the […]

如何“刷新”TCP客户端缓冲区?

我从几个示例中提取了一个连接到服务器的全双工C#TCP客户端。 基本概念是客户端和服务器都发送/接收消息(命令和事件)。 因此,我开发了一个FullDuplexSocket类,它公开了一个Send方法来向服务器发送消息,以及一个事件处理程序来接收来自服务器的消息。 一切正常,除了我似乎无法刷新从服务器收到的消息的缓冲区。 每次服务器发送新消息时,套接字中的缓冲区都包含所有旧消息(已读取) 和新消息。 我可以通过已知的分隔符(/ r / n)拆分消息并跟踪它们,但这可能是长时间运行通信时内存问题的根源。 [编辑:将代码更新为不再存在缓冲区问题并且工作正常的解决方案]。 有没有人有什么建议。 总重写??? 代码如下,希望它能帮助他人。 这是FullDuplexSocket类: using System; using System.Text; using System.Net.Sockets; namespace Utilities { public class StateObject{ public Socket workSocket = null; public const int BUFFER_SIZE = 1024; public byte[] buffer = new byte[BUFFER_SIZE]; } public class FullDuplexSocket : IDisposable { public event NewMessageHandler OnMessageReceived; […]

Visual Studio 2010不会停止在Socket.BeginReceive()回调中的未处理exception – 为什么?

通常,在附加调试器时,即使“exception”对话框在“已抛出”列中没有exception类型的勾号,Visual Studio 2010也会在未处理的exception处停止。 这里的关键字未处理; 所述对话框仅指处理的exception。 但是,在下面的最小示例中,Visual Studio 2010不会停止在我的exception中,即使它作为第一次机会exception出现在立即窗口中: 编辑:我发布的第一个最小的例子是我收到的第一个答案修复,但不幸的是下面的例子仍然显示问题: using System; using System.Net.Sockets; namespace SocketTest { class Program { static void Main(string[] args) { var listener = new TcpListener(8080); listener.Start(); AsyncCallback accepter = null; accepter = ar => { var socket = listener.EndAcceptSocket(ar); var buffer = new byte[65536]; AsyncCallback receiver = null; receiver = ar2 […]

快速重复TakeWhile导致无限循环

在stream.DataAvailable为false之前,如何进行以下可观察重复? 目前它看起来永远不会停止。 在Defer部分内的AsyncReadChunk和Observable.Return使OnNext调用然后OnCompleted调用。 当Repeat接收OnNext调用时,它将它传递给TakeWhile。 当TakeWhile不满意时,它完成了observable,但我认为在OnNext之后的OnCompleted是如此之快以至于它使Repeat重新订阅了observable并导致无限循环。 我该如何纠正这种行为? public static IObservable AsyncRead(this NetworkStream stream, int bufferSize) { return Observable.Defer(() => { try { return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0]); } catch (Exception) { return Observable.Return(new byte[0]); } }) .Repeat() .TakeWhile((dataChunk, index) => dataChunk.Length > 0); }

C#UDP套接字:获取接收者地址

我有一个异步UDP服务器类,其中一个套接字绑定在IPAddress.Any上,我想知道收到的数据包被发送到哪个IPAddress(…或收到)。 似乎我不能只使用Socket.LocalEndPoint属性,因为它总是返回0.0.0.0(这是有意义的,因为它绑定到…)。 以下是我目前使用的代码的有趣部分: private Socket udpSock; private byte[] buffer; public void Starter(){ //Setup the socket and message buffer udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345)); buffer = new byte[1024]; //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); } private void DoReceiveFrom(IAsyncResult […]