Tag: socket

线程和套接字

我有以下内容: ThreadStart startThread = delegate { mySocket.StartListen(); }; mySocket现在循环在Listen()上,当我: new Thread(startThread).Start(); 这是StartListen: public void StartListen() { Object locker = new Object(); // Lock resources lock (locker) { S = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); S.Blocking = false; try { S.Bind(serverEP); S.Listen(1000); isListening = true; /* * While statement not required here because AcceptConnection() * method instructs […]

在C#中对带有UDP协议的套接字感到困惑

我刚开始通过各种谷歌搜索来学习套接字,但是我在解决如何在C#中正确使用套接字时遇到了一些问题,而我需要一些帮助。 我有一个测试应用程序(Windows窗体)和一个不同的类(实际上是它自己的.dll,但这是无关紧要的)我有我的套接字代码的所有服务器/客户端代码。 问题1) 在我的测试应用程序中,在服务器部分,用户可以单击“开始监听”按钮,我的套接字应用程序的服务器部分应该开始监听指定地址和端口上的连接,到目前为止一切都很好。 但是,应用程序将被阻止,除非有人连接到服务器,否则我无法执行任何操作。 如果没有人连接怎么办? 我该怎么处理? 我可以指定接收超时但是呢? 抛出exception,我该怎么办? 我想要的是在主应用程序上进行某种活动,以便用户知道应用程序没有冻结并等待连接。 但是如果没有连接,它应该超时并关闭所有内容。 也许我应该使用异步调用来发送/接收方法,但它们似乎令人困惑,我无法使它工作,只有同步工作(我将在下面发布我当前的代码)。 问题2) 当某些发送/接收呼叫超时时,我是否需要关闭任何内容。 正如你在我当前的代码中看到的那样,我在套接字上有一堆关闭,但这种感觉不太合适。 但是当操作超时且我没有关闭套接字时,它也感觉不对。 在我的两个问题的结论….我想一个不阻止的应用程序,以便用户知道服务器正在等待连接(例如,使用一个小的选框动画)。 如果在一段时间后从未建立连接,我想关闭应该关闭的所有内容。 建立连接或在一段时间后没有发生连接时,我想告知结果的主要应用。 这是我的一些代码,其余的类似。 Packet类是一个自定义类,代表我的自定义数据单元,它只是现在基于enums的一堆属性,有方法将它们转换为字节并返回属性。 开始侦听连接的函数是这样的: public void StartListening(string address, int port) { try { byte[] bufferBytes = new byte[32]; if(address.Equals(“0.0.0.0”)) { udpSocket.Bind(new IPEndPoint(IPAddress.Any, port)); } else { udpSocket.Bind(new IPEndPoint(IPAddress.Parse(address), port)); } remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); int numBytesReceived […]

异步TCP服务器 – 消息框架建议

我在C#中有一个异步TCP套接字服务器,我使用Tocket的TcpListener / TcpClient包装器。 我对网络一般都很陌生,所以我不知道TCP如何处理发送的数据,以及它如何不保留消息边界。 经过一番研究后,我想我已经提出了一个可靠的解决方案,但我想知道是否有人对我有更多建议。 目前,我发送的数据是使用protobuf(Google的数据交换库)的序列化类对象的byte [] https://code.google.com/p/protobuf/ 在我序列化数据之后,在它发送之前,我决定在字节数组的开头附加一个4字节的Int32。 我的想法是,当数据包被发送到服务器时,它将解析出Int32,然后等到它接收到该数量的字节数,然后再对数据做任何事情,否则再次调用BeginRead。 这是我编写数据之前运行的代码,它似乎工作正常,但我对任何性能建议持开放态度: public byte[] PackByteArrayForSending(byte[] data) { // [0-3] Packet Length // [3-*] original data // Get Int32 of the packet length byte[] packetLength = BitConverter.GetBytes(data.Length); // Allocate a new byte[] destination array the size of the original data length plus the packet length array size […]

当我使用Socket.IO时,为什么我收到错误类型’System.OutOfMemoryException’的未处理exception

我编写了一个程序来获取屏幕截图并发送到服务器。 每次,我都有截图并转入base64,然后使用Socket.IO发送。 (使用SocketIOClient.dll) Dictionary image = new Dictionary(); image.add(“image”, “”); private void windowMonitorTimer_Tick(object sender, EventArgs e) { image[“image”] = windowMonitorManager.MonitorScreen(); client.getSocket().Emit(“Shot”, image); } windowMonitorManager.MonitorScreen()用于返回base64字符串。 如果我不使用client.getSocket().Emit(“Shot”, image) ,程序可以运行正确,但如果我添加这一行,程序停止2秒(发送近80次)并给我错误: An unhandled exception of type ‘System.OutOfMemoryException’ occurred in mscorlib.dll 如果我不发送字符串只要这个,只是一个短字符串“hello”,它发送1600次然后发生同样的问题。 有人知道如何调试这个问题? ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////// 我尝试测试socket.Emit(),并发现它有其限制。 例如,我发送一个10000000的字符串,经过88次,就会发生内存不足的问题。 如果我发送一个5000000的字符串,经过170次,就会出现同样的问题。