Tag: tcp

使用SSL创建TCP客户端连接

我正在尝试创建TCP连接并发送/读取使用SSL的数据,但我无法成功完成此操作。 我想做的是这样的: TcpClient _tcpClient = new TcpClient(“host”, 110); BinaryReader reader = new BinaryReader(new System.Net.Security.SslStream(_tcpClient.GetStream(), true)); Console.WriteLine(reader.ReadString()); 我虽然没有运气。 创建BinaryReader时抛出exception。 有谁知道这样做的一个简单例子? 我不想写这个服务器端,只是客户端。

在httpwebrequest中创建TCP连接的方式和位置,以及它与servicepoint的关系如何?

我试图找出在使用HttpWebRequest时何时建立TCP连接,如何使用ServicePoint汇集和重用这些连接。 我查看了system.dll,并尝试使用ILSpy和Reflector浏览代码,不知何故没有看到任何对套接字的引用,建立tcp连接等。 下面我已经粘贴了反编译的代码 – 任何请给我提示或重定向我,以便我能理解: 什么时候创建TCP连接? 如何使用ServicePoint保持这些连接的存活,汇集和重用? HttpWebRequest of System.dll的代码片段: public override Stream GetRequestStream() { TransportContext context; return this.GetRequestStream(out context); } public Stream GetRequestStream(out TransportContext context) { if (Logging.On) { Logging.Enter(Logging.Web, this, “GetRequestStream”, “”); } context = null; this.CheckProtocol(true); if ((this._WriteAResult == null) || !this._WriteAResult.InternalPeekCompleted) { lock (this) { if (this._WriteAResult != null) { throw […]

在TCP中接收数据

如果我在TCP中发送1000个字节,它是否保证接收器将获得整个1000字节“togther”? 或者他可能会先获得500个字节,之后他会收到其他字节? 编辑 :问题来自应用程序的观点。 如果1000个字节在到达应用程序之前重新组装到单个缓冲区中..那么我不在乎它是否在路上被分段。

WCF中的IPv4远程地址

与如何获取WCF远程端点的IP地址有关? 我在调用工作流方法时使用此代码检索远程IP地址: private static string GetRemoteIP() { var oc = OperationContext.Current; var mp = oc.IncomingMessageProperties; var remp = mp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; return remp == null ? “(unknown)” : remp.Address; } 但是,我得到的地址是“:: 1”。 我不想要IPv6地址,我想要IPv4(127.0.0.1) – 任何强制这种方式?

在C#中发送TCP数据包

我想在C#中发送TCP数据包(带有自定义标头)。 建立这样的数据包是没有问题的,我有一个字节数组的数据。 但是如何通过套接字发送此数据包? 我试过这样的事情: using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)) { TcpPacket tcpPacket = new TcpPacket(); // fill tcpPacket with data sock.Bind(new IPEndPoint(MYADDRESS, MYPORT)); byte[] data = tcpPacket.GetBytes(); sock.SendTo(data, new IPEndPoint(DESTADDRESS, DESTPORT)); } 这没有任何例外,但是嗅探网络显示没有任何内容发送。 解决办法是什么? 我使用的是Windows 7 Professional,我不希望系统单独创建完整的TCP连接。 PS:我不想使用其他一些库。 PS:构建IP数据包也不是问题。

使用TcpClient创建http请求

我创建了一个空的asp.net Web应用程序,我有一个简单的aspx页面: protected void Page_Load(object sender, EventArgs e) { Response.Write(“Hello world”); } 当我转到http://localhost:2006/1.aspx我看到一个页面上写着“Hello world”。 好吧,如果我这样做的话#: WebClient webClient = new WebClient() { Proxy = null }; var response2 = webClient.DownloadString(“http://localhost:2006/1.aspx”); 那么response2 ==“Hello world” 我需要使用原始tcp连接实现相同的function 我试图用tcp连接实现同样的事情,由于某种原因它不起作用: byte[] buf = new byte[1024]; string header = “GET http://localhost:2006/1.aspx HTTP/1.1\r\n” + “Host: localhost:2006\r\n” + “Connection: keep-alive\r\n” + “User-Agent: Mozilla/5.0\r\n” + […]

async / await会影响tcp服务器的性能吗?

我在C#5.0中创建一个Tcp服务器,我在调用tcpListener.AcceptTcpClientAsync和networkStream.ReadAsync时使用了await关键字 但是当我使用Process Explorer检查我的服务器的CPU使用率时,我得到以下结果: Tcp Sync版本: CPU使用率为10% Tcp异步版本: 30%的CPU使用率一半的使用是内核使用。 此外,我通过在网络流的外观中添加计数器来测量我接收数据的时间,并且异步版本循环120,000次,而同步版本循环2,500,000次。 在收到的消息/秒中,当从3个不同的客户端接收消息时,异步版本比同步版本慢15%。 为什么Async Version使用比Sync版本更多的CPU? 这是因为async / await关键字吗? 这是正常的Async Tcp服务器比它的同步速度慢吗? 编辑:这是异步tcp服务器代码的示例 public class AsyncTcpListener : ITcpListener { private readonly ServerEndpoint _serverEndPoint; // Custom class to store IpAddress and Port public bool IsRunning { get; private set; } private readonly List _tcpClientConnections = new List(); private TcpListener _tcpListener; public […]

通过暂时启用NoDelay来套接“刷新”

背景 我在C#中实现了HTTP服务器。 使用ab我发现了一个奇怪的性能问题。 保持活动关闭时,每个请求需要5毫秒,而保持活动状态则需要40毫秒! 测试页生成单个字节[],使用单个套接字作为回复发送。发送调用。 原因是我可以告诉Nrab在TCP堆栈中使用的算法。 TCP Flush? 到目前为止,我在每个服务的HTTP请求的末尾使用NoDelay属性。 socket.NoDelay = true; socket.NoDelay = false; 现在哪个解决了这个问题。 但我没有备份我的发现的文件。 这是在linux / mono系统上测试的。 是否有标准的方式来刷新TCP连接? 有关 这个答案正在解决同样的问题。 这里的不同之处在于我希望暂时禁用该算法。

如何正确关闭客户端代理(远程主机强行关闭现有连接)?

在你将问题读到最后之前,请不要关闭。 我已经谷歌搜索了几个小时没有成功。 编辑:现在我确信它与WCF缓存打开TCP连接(连接池)的方式有关。 请在问题结尾处查看编辑#5。 我基本上有一个使用netTcpBinding配置的WCF服务。 即使我正常关闭客户端代理(请参阅下面的代码),服务器始终记录“ System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host ”。 我已经将问题缩小到我能写的最基本的WCF示例。 我每次关闭客户端应用程序时都会在WCF跟踪生成的日志中获得exception。 我在自己的代码中没有得到任何exception,这意味着它按预期工作,我无法调试任何东西,看看WCF在我的日志中添加错误出了什么问题。 服务接口/实现: [ServiceContract] public interface IService1 { [OperationContract] string DoWork(); } … public class Service1 : IService1 { public string DoWork() { return “12”; } } 服务器端配置: 客户端配置: 使用该服务的客户端代码(VS2012使用“添加服务引用”为我生成了客户端代理): private async Task TestTask() { […]

如何防止sockets/端口耗尽?

我试图通过跨多个线程的请求命中它来对网站进行性能测试。 每个线程执行n次。 (在for循环中) 但是,我遇到了问题。 特别是WebException(“无法连接到远程服务器”)与内部exception: 无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或者队列已满,因此127.0.0.1:52395 我试图在每个线程500次迭代时运行100个线程。 最初我在System.Net中使用HttpWebRequest向服务器发出GET请求。 目前我正在使用WebClient因为我假设每次迭代都使用新的套接字(因此在短时间内就会有100 * 500个套接字)。 我假设WebClient(每个线程实例化一次)只会使用一个套接字。 我不需要一次打开50 000个套接字,因为我想发送GET请求,接收响应并关闭套接字,释放它以便在下一个循环迭代中使用。 我明白这将是一个问题 但是,即使使用WebClient,也会请求一堆套接字,从而在TIME_WAIT模式下生成一堆套接字(使用netstat检查)。 这会导致其他应用程序(如Internet浏览器)挂起并停止运行。 我可以用更少的迭代和/或更少的线程来操作我的测试,因为看起来套接字最终会退出这个TIME_WAIT状态。 但是,这不是一个解决方案,因为它没有充分测试Web服务器的function。 题: 在每次线程迭代后如何显式关闭套接字(从客户端)以防止TIME_WAIT状态和套接字耗尽? 码: 包装HttpRequest的类 编辑:在使用中包装WebClient,因此为每次迭代实例化,使用和处理新的WebClient。 问题仍然存在。 public sealed class HttpGetTest : ITest { private readonly string m_url; public HttpGetTest( string url ) { m_url = url; } void ITest.Execute() { using (WebClient webClient = new WebClient()){ […]