相关疑难解决方法(0)

如何检查TcpClient连接是否已关闭?

我正在玩TcpClient,我试图弄清楚如何在连接断开时使Connected属性为false.

我试过了

NetworkStream ns = client.GetStream();
ns.Write(new byte[1], 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是如果TcpClient断开连接,它仍然不会显示给我.你会如何使用TcpClient进行此操作?

c# sockets networkstream tcpclient

29
推荐指数
3
解决办法
5万
查看次数

连接后如何测试TCPClient连接断开?

我一直在争论一个问题整整3天我找不​​到任何解决方案,请帮助:)
我使用Visual Studio 2010和C#语言.

我有一台像服务器一样工作的设备,它在非常不规则的时间段内发送一些数据(不可能定义任何读取超时).
我写了一个TCP客户端来连接到该服务器并读取数据.它工作正常,但是当网络出现问题并且服务器变得不可用时(例如,当我从计算机中拔出网线时),应用程序需要大约10秒才能"注意到"没有连接到服务器并且丢弃一个例外.(我不知道为什么到了10秒?它在哪里定义?我可以改变它吗?)
我想要更快地做出反应 - 让我们说连接断开后一秒钟.
然而谷歌搜索答案并没有为我提供任何有效的解决方案.

测试代码如下,我尝试在2个线程上进行:一个是读取数据,第二个是查找连接状态,当它被破坏时应该报警.它既不适用于TCPClient也不适用于Socket类.我曾尝试用tcpClient.SendTimeout = 100;和读取/写入一些数据,stream.WriteTimeout = 100;但它似乎不起作用.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;

namespace TCPClient
{
    class Program
    {
        static volatile bool _continue = true;
        static TcpClient tcpClient;
        static NetworkStream stream;

        static void Main(string[] args)
        {
            try
            {
                //client thread - listen from server
                Thread tcpListenThread = new Thread(TcpListenThread);
                tcpListenThread.Start();

                //connection checking thread
                Thread keepAliveThread = new Thread(KeepAliveThread);
                keepAliveThread.Start();

                while …
Run Code Online (Sandbox Code Playgroud)

c# tcp visual-studio-2010

10
推荐指数
3
解决办法
5万
查看次数

如何检测断开连接的套接字C#?

我一直在使用C#中的套接字客户端程序,并且想知道如何检测套接字的另一端何时"不正常"地断开连接,就像拔出网络电缆或硬重置一样.

我在下面有这些函数来访问套接字,根据这里的SO问题和这篇MSDN文章,检查断开连接套接字的最佳方法是发送长度为0的1字节消息.如果抛出异常并且WSAEWOULDBLOCK不是错误代码,然后套接字断开连接.我试过这个但是在硬重置服务器连接后,客户端将调用Send(new byte[1], 0, 0, SocketFlags.None)并成功Receive()返回,之后命令会返回WSAEWOULDBLOCK错误.

是什么赋予了??

这是我下面的代码. _socket设置为非阻塞模式:

private int nonBlockRecv(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
    int bytesRecv = 0;

    while (true)
    {
        try
        {
            nonBlockSend(new byte[1], 0, 0, sf);
            bytesRecv = _socket.Receive(recvBytes, offset, size, sf);
            break;
        }
        catch (SocketException excp)
        {
            if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
                throw excp;
        }
    }

    return bytesRecv;
}

private int nonBlockSend(byte[] sendBytes, int offset, int size, SocketFlags sf)
{
    int …
Run Code Online (Sandbox Code Playgroud)

c# sockets

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

标签 统计

c# ×3

sockets ×2

networkstream ×1

tcp ×1

tcpclient ×1

visual-studio-2010 ×1