Tag: sockets

使用C#(。net)下的HTTP服务器保持活动套接字如何发送多个查询?

Noob的问题。 所以我尝试这个代码在同一个套接字上多次调用http服务器资源: public void TryReuseSameSocket(){ var addr = Dns.GetHostAddresses(“stackoverflow.com”); var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); try { // i thought that i must to use this option socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); socket.Connect(addr, 80); var bigbuff = new byte[10000]; for (var i = 0; i < 20; i++) { //now i try to call some URL many […]

从StreamSocket读取时,DataReader结果被截断

我有以下c#/ WinRT代码来接收来自IMAP命令的响应 DataReader reader = new DataReader(sock.InputStream); reader.InputStreamOptions = InputStreamOptions.Partial; await reader.LoadAsync(1000000); string data = string.Empty; while(reader.UnconsumedBufferLength > 0){ data += reader.ReadString(reader.UnconsumedBufferLength); } 结果在8192个字节后被截断。 8192看起来很像某种极限。 我该如何解决这个问题?

如何判断Socket的发送缓冲区中有多少数据

我可以通过调用Socket.IOControl(IOControlCode.DataToRead, null, outValue);来判断Socket的接收缓冲区中有多少数据Socket.IOControl(IOControlCode.DataToRead, null, outValue); 是否有相当于告诉Socket的发送缓冲区中有多少数据? 我需要在带宽和延迟受限的网络上发送尽可能多的UDP数据包,并且我遇到了溢出发送缓冲区的情况,因此我需要实现某种forms的限制。

UDP – 我可以发送两个数据报部分,并使接收端将它们组合成一个吗?

这可能是一个愚蠢的问题,但由于我对UDP相对较新,所以…如果我有两个独立的字节数组,我需要接收端作为一个大数组,例如: byte[] Array1 = {1,1,1} byte[] Array2 = {2,2,2} 我可以避免创建缓冲区并将每个数组复制到其中,然后发送该缓冲区,如下所示: byte[] Buffer= new byte[Array1.Length + Array2.Length]; Buffer.BlockCopy(Array1, 0, Buffer, 0, Array1.Length); Buffer.BlockCopy(Array2, 0, Buffer, Array1.Length, Array2.Length); udpClient.Send(Buffer, Buffer.Length); 因为如果两者都很大,并且数据速率很高,那么复制会占用很多系统资源……所以我可以告诉udpClient我正在启动UDP碎片,然后这样做: udpClient.ImStartingOneBigDatagram(); udpClient.Send(Array1, Array1.Length); udpClient.Send(Array2, Array2.Length); udpClient.ThatsAllFolks(); 并确保接收方获得: byte[] recv = {1,1,1,2,2,2} 我正在使用C#,我不需要使用UdpClient ,我只是在说明我的观点。

获取UdpClient在主线程中接收数据

我正在尝试将LAN服务器发现添加到我的Unity游戏中。 我正在使用UDP来广播请求。 如果网络上的任何人是服务器,他们将回复一些服务器数据。 我已经弄清楚了这一部分,但我需要使用一些Unity函数(包括其他自定义monobehaviour脚本)来生成数据包数据。 Unity不允许从主要线程以外的任何线程访问其API。 我正在使用UdpClient.BeginReceive , UdpClient.EndReceive , AsyncCallback流程。 因此接收AsyncCallback函数( AsyncRequestReceiveData的示例脚本中的AsyncRequestReceiveData )在另一个不允许我使用任何Unity函数的线程中运行。 我用flamy的这个答案作为我脚本的基础。 我已经尝试在脚本听到请求时在AsyncRequestReceiveData触发委托和事件,但它似乎在同一个单独的线程中触发。 由单独的线程在主线程中触发的事件可以很好地工作,但我不确定如何做到这一点。 虽然脚本inheritance自MonoBehaviour (Unity 3D中的基础对象),但它应该运行得很好。 脚本的输出应如下所示: 传递请求:requestedServers 收到请求:requesServers 这是准系统脚本: using UnityEngine; using System; using System.Collections; using System.Net; using System.Net.Sockets; public class TestUDP : MonoBehaviour { public delegate void RequestReceivedEventHandler(string message); public event RequestReceivedEventHandler OnRequestReceived; // Use this to trigger the event […]

Silverlight套接字:模仿框架Bind,Listen和Accept方法?

我有这个.NET Framework C#类,它实际上充当System.Net.Sockets命名空间中Socket类周围的TCP连接的包装器。 最近我已将此包装类的API迁移到Silverlight,但由于Silverlight中Socket类的限制 ,以及关于可用端口,客户端访问策略等的正常信任限制,我只实现了网络客户端支持我的Silverlight版本。 现在,使用Silverlight 5(RC) ,即使对于浏览器内SL应用程序也可以应用提升的信任,这样就删除了我在SL 4中必须遵守的所有端口和客户端访问策略限制。 我的问题是,如果还有一种方法可以在我的SL包装器类中实现某种网络服务器支持? 更具体地说,Silverlight中有一种方法可以模仿.NET Framework Socket类的Bind,Listen和Accept方法吗? 为了模仿Socket.Connect,我在Silverlight Socket类中使用了ConnectAsync方法。 可以使用例如Receive(From)Async对Bind / Listen / Accept方法做类似的事情吗? 提前致谢。

C#SSL安全套接字

我有一个很好的,有效的沟通应用程序,用C#编写。 现在我需要实现与服务器的安全连接。 我已经尝试将Socket和TcpClient对象更改为SslStream,但是我遇到了一些错误。 首先,我使用makecert生成了一个.cer证书。 OpenSSL证书对我没用,因为它们不包含私钥。 接下来,我在服务器上创建了一个证书对象,并将其绑定到SslStream: X509Certificate serverCertificate = X509Certificate.CreateFromCertFile(“ca.cer”); TcpClient clientSocket = this.tcpListener.AcceptTcpClient(); SslStream ssls = new SslStream(clientSocket.GetStream(), false); ssls.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true); 在客户端我这样做: TcpClient client = new TcpClient(settings.IP, settings.Port); sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); sslStream.AuthenticateAsClient(settings.IP); public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == […]

从UDP套接字接收并发回数据

我正在尝试编写一个接受请求的控制台应用程序(大小为18个字节),然后将一些东西(大小为7个字节)发送回客户端。 我为我的生活似乎无法让这个工作。 我可以很好地接收数据,但我发回的数据永远不会到达客户端。 这是我的代码 static void Main(string[] args) { // Data to return byte[] ret = { 0xfe, 0xfd, 0x09, 0x00, 0x00, 0x00, 0x00 }; // tell the user that we are waiting Console.WriteLine(“Waiting for UDP Connection…”); // Create a new socket to listen from Socket Skt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Skt.EnableBroadcast = true; […]

如何在C#中传输数据包时正确保持UI更新?

我有这种forms,它产生一个新的线程,并开始侦听并等待循环中的UDP数据包。 我需要的是保持UI更新接收的字节数。 为此,我设置了一个事件,我会在收到数据包后立即提出这个事件并将接收到的字节数作为参数传递。 由于我没有在UI线程上运行,我不能简单地直接更新UI。 这是我目前正在做的事情: private void EVENTHANDLER_UpdateTransferProgress(long receivedBytes) { if(InvokeRequired) { Invoke(new MethodInvoker(() => { totalReceivedBytes += receivedBytes; Label.Text = totalReceivedBytes.ToString(“##,0”); })); } } 但这仍然在与数据包接收循环相同的线程上运行,并且它不会返回到该循环 – 并等待另一个数据包 – 直到此EVENTHANDLER_UpdateTransferProgress方法返回。 我的问题基本上是关于上述方法中的以下行: Label.Text = totalReceivedBytes.ToString(“##,0”); 像这样更新UI会减慢数据包接收速度。 如果我取消该行(或评论它),数据包接收将更快。 我怎么可能解决这个问题? 我认为更multithreading是关键,但我不确定如何在这种情况下正确实现它们……我正在使用带有.NET 2.0的Windows Forms。 编辑: 在我之前的测试中,上述情况似乎是正确的,实际上可能在某种程度上。 但经过一些测试后,我意识到问题出在整个Invoke(new MethodInvoker(() => { … })); 事情。 当我删除它(当然不会更新UI)并离开EVENTHANDLER_UpdateTransferProgress但继续提升事件时,数据包接收速度要快得多。 我测试了接收一些文件,平均大约需要1.5秒,而不需要在事件处理程序上调用Invoke() 。 当我在事件处理程序中调用Invoke()时,即使没有更新UI中的任何控件或执行任何操作(换句话说,匿名方法体是空的),它花费的时间更长,约为5.5秒。 你可以看到它有很大的不同。 反正有没有改善这个?

没有协议的C#SuperSocket

问题很简单:我已经阅读了整个SuperSocket文档但我不明白是否有一种方法可以在没有实现协议的情况下使用它。 我不需要发送特定命令,只需要发送一个或几百个字节,具体取决于许多因素。 我需要更新一个使用简单套接字的旧TCP服务器,它是我4年多前使用System.Net.Sockets libs制作的,我想用SuperSocket作为一个更好的解决方案使用一个好的笔记库。 这是个好主意吗? 先感谢您。