标签: networkstream

NetworkStream.Read的替代方案,表示远程主机已关闭连接?

关于使用TcpClient类处理TCP/IP连接,除了等待NetworkStream.Read方法返回0 之外,是否有替代方法可以检查远程主机是否已关闭连接?

c# connection tcp networkstream tcpclient

5
推荐指数
1
解决办法
5790
查看次数

NetworkStream.DataAvailable是否可以看到缓冲数据?

NetworkStream.DataAvailable是否知道发件人的发送缓冲区是否为空?或者它只是表明接收者的读缓冲区是否有数据?我的假设是后者......

具体来说,对于涉及正在进行的对话的一些套接字工作,我目前使用长度前缀,以便接收者确切地知道当前批次中有多少数据; 但是,我已经发送了一个.patch,建议我使用NetworkStream.DataAvailable.我担心的是,这只会告诉我接收器的内容 - 而不是发送者最初发送的内容 - 但我不是套接字专家.

我错了吗?或者是长度前缀的方式去?

(注意我不能简单地读取()直到流关闭,因为在同一个连接上发送了多个批次,并且将每个批处理视为单独处理是至关重要的;如果我在一个批次中读取太多(即使它得到缓冲和丢弃)然后谈话将破裂).

.net networkstream stream

4
推荐指数
1
解决办法
2519
查看次数

在NetworkStream上读取= 100%的CPU使用率

我正在从一个在while循环中的NetworkStream中读取.问题是我看到100%的CPU使用率.有没有办法阻止这种情况发生?

这是我到目前为止:

    while (client != null && client.Connected)
            {

                NetworkStream stream = client.GetStream();
                data = null;

                try
                {
                    // Check if we are still connected.
                    if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];

                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }

                    if (stream.DataAvailable)
                    {
                        //Read the first command
                        WriteToConsole("Waiting for next command");
                        data = ReadStringFromClient(client, stream);
                        WriteToConsole("Received Command: " + data);
                    }
                }
Run Code Online (Sandbox Code Playgroud)

......代码继续......

ReadStringFromClient代码:

   private string ReadStringFromClient(TcpClient clientATF, NetworkStream currentStream)
    {
        int i;
        string builtString; …
Run Code Online (Sandbox Code Playgroud)

.net c# sockets networkstream cpu-usage

4
推荐指数
3
解决办法
5537
查看次数

使用NetworkStream.BeginRead和NetworkStream.EndRead实现超时

我编写了以下函数来使用NetworkStream异步读取函数(BeginReadEndRead)实现超时功能.它工作正常,直到我注释掉该行Trace.WriteLine("bytesRead: " + bytesRead);.为什么?

private int SynchronousRead(byte[] buffer, int count)
{
    int bytesRead = 0;
    bool success = false;
    IAsyncResult result = null;

    result = _stream.BeginRead(
        buffer, 0, count,
        delegate(IAsyncResult r)
        {
            bytesRead = _stream.EndRead(r);
        },
        null);

    success = result.AsyncWaitHandle.WaitOne(_ioTmeoutInMilliseconds, false);

    if (!success)
    {
        throw new TimeoutException("Could not read in the specfied timeout.");
    }

    //If I remove this line, bytesRead is always 0
    Trace.WriteLine("bytesRead: " + bytesRead);

    return bytesRead;
}
Run Code Online (Sandbox Code Playgroud)

万一你想知道,我必须这样做,因为我最终需要针对.Net Compact …

.net c# asynchronous networkstream

4
推荐指数
1
解决办法
5186
查看次数

从NetworkStream调用BeginRead

好的我想连接到a Socket并使用System.Net.Sockets.NetworkStream该类读取网络流.这是我到目前为止:

NetworkStream myNetworkStream;
Socket socket;

socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, 
    ProtocolType.IPv4);
socket.Connect(IPAddress.Parse("8.8.8.8"), 8888);

myNetworkStream = new NetworkStream(socket);

byte[] buffer = new byte[1024];
int offset = 0;
int count = 1024;

myNetworkStream.BeginRead(buffer, offset, count, ??, ??);
Run Code Online (Sandbox Code Playgroud)

现在我需要一个AsyncCallback和一个Object state来完成我的BeginRead方法,但我甚至不确定这是否会起作用.我此时有点失落!我在哪里需要离开这里?

c# network-programming networkstream

4
推荐指数
1
解决办法
2万
查看次数

NetworkStream 丢失数据

相关数据是一个 PNG 文件,其大小为 int 前缀。

-Sending:
ns.Write(BitConverter.GetBytes((int)data.Length),0,4);
ns.Write(data, 0, data.Length);

-Reading:
byte[] sizearray = new byte[4];
ns.Read(sizearray, 0, 4);
int dataSize = BitConverter.ToInt32(sizearray,0);

byte[] data = new byte[dataSize];
ns.Read(data, 0, dataSize);
Run Code Online (Sandbox Code Playgroud)

然后将接收到的数据保存到文件中。我也用 BeginRead/EndRead 尝试过,结果相同。

问题是,虽然这适用于大多数较小的图像,但它不会收到超过几 KB 的图像。dataSize 读取正确,但每次读取几千字节后(~2900),接收到的数据的其余部分为 0。示例

我是否忽略了一些事情,比如一次可以发送多少的限制?

c# networkstream

4
推荐指数
1
解决办法
1479
查看次数

TcpClient TimeOuts与NetworkStream TimeOuts

在以下通用场景中:

System.Net.Sockets.TcpClient TC = SomeHowObtained;
System.Net.Sockets.NetworkStream NS = TC.GetStream();
Run Code Online (Sandbox Code Playgroud)

据我所知,有3次超时:

NS.ReadTimeout // 1
TC.SendTimeout // 2
TC.ReceiveTimeout // 3
NS.WriteTimeout // 4
Run Code Online (Sandbox Code Playgroud)

在行为意义上是(1)=(3)和(2)=(4)?文档没有给出提示.

c# timeout networkstream tcpclient

4
推荐指数
1
解决办法
3561
查看次数

为什么处理 NetworkStream 会断开客户端连接

当以下裸机代码正在发送或接收数据时,客户端会断开连接。

我的理解是 using 块处理它创建的对象,即 NetworkStream 对象,但为什么 TcpClient Socket 断开连接?

控制台输出是... True False

class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Client";

            Process p = Process.Start(@"C:\Users\Teddy\Documents\visual studio 2015\code\TesyingNetworkStream\Server\bin\Debug\server.exe");
            Thread.Sleep(1000);

            IPEndPoint EP = new IPEndPoint(
                    IPAddress.Parse("192.168.1.10"), 4000
                    );

            TcpClient cli = new TcpClient();
            cli.Connect(EP);

            UseClient(cli);

            Console.ReadLine();
            p.Kill();
            p.Close();
        }

        private static void UseClient(TcpClient cli)
        {
            using (NetworkStream ns = cli.GetStream())
            {
                Console.WriteLine(cli.Connected);//True
            }
            Console.WriteLine(cli.Connected);//False
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果重要,这里是服务器代码。

class Program2
    {
        static void Main(string[] args)
        {
            Console.Title = "Server";

            TcpListener lis …
Run Code Online (Sandbox Code Playgroud)

c# using networkstream disconnect

4
推荐指数
1
解决办法
904
查看次数

NetworkStream获取System.IO.IOException:无法将数据写入传输连接

我正在使用NetworkStream来保持可以发送消息的开放TCP/IP连接.我收到一条消息,处理它,然后返回一个ACK.我正在使用一个偶尔收到消息的站点,但是当我发送ACK时,我得到一个IOException.有时这只持续一两条消息(我可以接收下一条消息),有时它会一直持续到服务停止并重新启动.

下面是我的NetworkStream的代码,没有任何处理:

using (NetworkStream stream = client.GetStream())
{
   stream.ReadTimeout = ReadTimeout;
...
   if (stream.CanRead && stream.DataAvailable)
   bytesRead = stream.Read(receivedBytes, 0, BufferSize);
...
   stream.Write(ack, 0, ack.Length);
}
Run Code Online (Sandbox Code Playgroud)

请注意,代码在读取新消息和发送ACK之间循环.

当我打电话时stream.Write,我有时会得到以下异常:

System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace --- …
Run Code Online (Sandbox Code Playgroud)

c# tcp networkstream ioexception

4
推荐指数
1
解决办法
4758
查看次数

使用\ r作为行终止符时,StreamReader.ReadLine无法通过TCP工作

当我仅用\r作行终止符时,该StreamReader.ReadLine()方法不起作用.它可以使用Environment.NewLine,\r\n或者\ra("a"是任何字符).这是一个错误吗?使用MemoryStream而不是NetworkStream时不会发生同样的问题.如果我无法更改协议,我可以使用哪些变通方法?

我的服务

Thread service = new Thread((ThreadStart)delegate
{
    TcpListener listener = new TcpListener(IPAddress.Loopback, 2051);
    listener.Start();
    using (TcpClient client = listener.AcceptTcpClient())
    using (NetworkStream stream = client.GetStream())
    using (StreamReader reader = new StreamReader(stream))
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.AutoFlush = true;
        string inputLine = reader.ReadLine(); // doesn't work - freezes here
        writer.Write("something\r");
    }
});
service.Start();
Run Code Online (Sandbox Code Playgroud)

我的客户

using (TcpClient client = new TcpClient("localhost", 2051))
using (NetworkStream stream = client.GetStream())
using (StreamWriter …
Run Code Online (Sandbox Code Playgroud)

.net c# networkstream readline streamreader

3
推荐指数
1
解决办法
5236
查看次数