Tag: tcpclient

发送二进制文件TcpClient – 文件大于源

为了让我的脚趾在网络编程的水中,我写了一个小的控制台应用程序将png文件发送到服务器(另一个控制台应用程序)。 服务器正在写入的文件略大于源png文件。 它不会打开。 客户端应用程序的代码是: private static void SendFile() { using (TcpClient tcpClient = new TcpClient(“localhost”, 6576)) { using (NetworkStream networkStream = tcpClient.GetStream()) { //FileStream fileStream = File.Open(@”E:\carry on baggage.PNG”, FileMode.Open); byte[] dataToSend = File.ReadAllBytes(@”E:\carry on baggage.PNG”); networkStream.Write(dataToSend, 0, dataToSend.Length); networkStream.Flush(); } } } Server应用程序的代码是: private static void Main(string[] args) { Thread thread = new Thread(new […]

TcpClient或HttpWebRequest到Apple TV 30秒后结束?

我正在使用C#创建一个库来使用Airplay协议将照片和video发送到Apple TV(特别是与第3代一起使用,但希望这对此无关紧要)。 https://airlib.codeplex.com/ 根据此规范,Airplay的所有命令都是端口70上的HTTP: http : //nto.github.com/AirPlay.html 我已成功地在Apple TV上播放照片和video,但无论我做什么,AppleTV都只播放30秒的video。 看起来我的C#客户端发出播放命令就是在30秒时断开连接,这导致AppleTV结束播放会话。 我认为这个的原因: 完全终止客户端应用程序会产生与等待30秒相同的行为(基本上强制连接关闭)。 手动关闭HttpWebRequest或TcpClient连接会产生相同的行为(在播放会话中途)。 无论我持有断点多长时间以阻止GetResponse()调用,video总是在WebRequest开始发送消息后30秒超时。 为video使用不同的源(IIS,外部Web服务器)不会更改行为。 即使video已经在AppleTV上缓存并且没有重新流,超时仍然会发生。 我非常确定客户端请求需要在video的“播放”过程中保持连接,据我所知,我已将其编码为此。 我真的在我的智慧结束。 我已经尝试了我能想到的所有内容,包括作为HttpWebRequest和原始TcpClient(它们都工作但都超时)执行请求,将接收/发送超时设置为疯狂数字,并循环读取Tcp流确保有“活动”。 好像AppleTV期待我发送“嘿,继续播放”的消息,但我还没有从网上的任何来源看到类似的东西。 我希望这只是一些愚蠢的东西,我不是基于我缺乏Http / Tcp知识。 这是我的代码: Uri url = “http://somevideo.com/video.mov”; float startPosition = 0; TcpClient tcpClient = new TcpClient(“192.168.1.20”,7000); tcpClient.ReceiveTimeout = 100000; tcpClient.SendTimeout = 100000; //get the client stream to read data from. NetworkStream clientStream = tcpClient.GetStream(); […]

C#为什么不“刷新”强制网络流中的字节?

我有一个项目,我正在尝试将序列化对象发送到服务器,然后等待“OK”或“ERROR”消息返回。 我似乎遇到了类似的问题: TcpClient发送/关闭问题 问题是,我似乎能够发送原始对象的唯一方法是关闭连接,但然后(当然)我迫不及待地想看看服务器是否成功处理了对象。 private void button4_Click(object sender, EventArgs e) { RequestPacket req = new RequestPacket(); /// … Fill out request packet … /// Connect to the SERVER to send the message… TcpClient Client = new TcpClient(“localhost”, 10287); using (NetworkStream ns = Client.GetStream()) { XmlSerializer xml = new XmlSerializer(typeof(RequestPacket)); xml.Serialize(ns, req); /// NOTE: This doesn’t […]

序列化对象准备通过TCPClient Stream发送

我已经使用TcpListener和TcpClient设置了服务器和客户端。 我想将一个对象发送到我的服务器应用程序进行处理。 我已经发现了using System.Runtime.Serialization和以下文档 ,但我不想发现我正在以漫长的方式做这件事。 问题:通过TCP流处理和发送对象的最佳方法是什么? 发送和接收。 这是我的对象的一个​​例子: // Create a new house to send house newHouse = new house(); // Set variables newHouse.street = “Mill Lane”; newHouse.postcode = “LO1 BT5”; newHouse.house_number = 11; newHouse.house_id = 1; newHouse.house_town = “London”;

通过tcp或套接字发送类型对象

我在为Xna制作的非常简单的游戏创建网络界面时遇到了麻烦。 我只需要通过TCP客户端/ Socket发送对象。 例如:我有一个名为“玩家”的class级。 在每个播放器中,都有一个字段名称“Info”,类型为“PlayerInfo”。 在客户端/服务器中,我需要将每个玩家的信息发送给每个客户,除了发送它的人(显然)。 这是一个简单的例子,但是我需要用大约5到10个对象来做,再加上发送玩家更新(位置,动作……)有没有一种简单的方法可以用TCP / Sock做到这一点? 注意:我会将我的知识用C#和编程评为6/10,所以如果你有解决方案,你不需要解释所有内容(例如:变量和字段之间有什么区别)。 我也知道接口,库等…提前谢谢!

什么条件导致NetworkStream.Write阻塞?

NetworkStream.Write只会阻塞它将数据发送到TCP发送缓冲区,还是阻塞直到接收主机实际确认数据为止? 注意:套接字配置为阻止I / O. 编辑:哎呀,当然没有TcpClient.Write这样的东西! 我们都明白我们在谈论TcpClient.GetStream().Write ,实际上是NetworkStream.Write !

从HttpWebRequest / Response获取底层tcp连接

我正在尝试获取有关当我连接到比HttpWebRequest和HttpWebResponse给我更低级别的网站时发生的事情的更多信息。 我正在使用C#。 我希望能够看到有关dns查找的信息以及建立连接所花费的时间(如果建立了新连接)。 HttpWebRequest和HttpWebResponse工作在比这更高的级别,我想询问是否有获取底层TcpClient对象(或他们使用的任何低级别对象)的方法。 如果不可能,那么有没有办法获取和操作.net维护的连接列表,而不通过HttpWebRequest或HttpWebResponse获取它? 我无法更改我正在使用TcpClient的应用程序,因为可靠地实现所有http内容太费时间了。

使用TcpClient和Reactive Extensions从Stream读取连续字节流

请考虑以下代码: internal class Program { private static void Main(string[] args) { var client = new TcpClient(); client.ConnectAsync(“localhost”, 7105).Wait(); var stream = client.GetStream(); var observable = stream.ReadDataObservable().Repeat(); var s = from d in observable.Buffer(4) let headerLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(d.ToArray(), 2)) let b = observable.Take(headerLength) select b.ToEnumerable().ToArray(); s.Subscribe(a => Console.WriteLine(“{0}”, a)); Console.ReadLine(); } } public static class Extensions […]

高性能异步等待套接字

我正在编写一个应用程序,需要通过tcp进行数百个套接字连接才能读/写数据。 我在这里遇到过这段代码片段 ,我想知道如何让它更强大。 这是我目前调用代码的方式: foreach (var ip in listofIps) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ip), 4001); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(remoteEP); await ReadAsync(client); } 以上是否有任何问题,如何进行优化以使其同时运行? 在代码片段中,缓冲区大小设置为1000.正如一个简单的说明,如果我只尝试打印出接收的字节,而不是剩余的0x00,我必须做这样的事情: while (true) { await s.ReceiveAsync(awaitable); int bytesRead = args.BytesTransferred; if (bytesRead <= 0) break; var hex = new StringBuilder(bytesRead * 2); var msg = new byte[bytesRead]; […]

如何使用TcpClient获取客户端IP地址?

我正在使用TcpClient在端口上侦听请求。 当请求从客户端进来时,我想知道发出请求的客户端ip。 我试过了: Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString()); Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString()); var networkStream = tcpClient.GetStream(); var pi = networkStream.GetType().GetProperty(“Socket”, BindingFlags.NonPublic | BindingFlags.Instance); var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString(); Console.WriteLine(socketIp); 所有这些地址都输出10.xxx地址,这些地址是私有地址,显然不是发出请求的网络客户端的地址。 如何获取发出请求的客户端的公共IP? 编辑:我们正在使用带有tcp转发的Amazon EC2负载均衡器。 有没有办法在这个设置中获得真正的客户端IP?