相关疑难解决方法(0)

如何在C#中检查(dis)连接(TCP)套接字?

我应该如何检查(TCP)套接字以确定它是否已连接?

我已经阅读了MSDN中Socket.Connected属性,但它说它只根据最后一个I/O显示状态.这对我没用,因为我想尝试从套接字读取之前这样做.备注部分还指出:

如果需要确定连接的当前状态,请进行非阻塞,零字节发送调用.如果调用成功返回或抛出WAEWOULDBLOCK错误代码(10035),则套接字仍然连接; 否则,套接字不再连接.

同一页面上的示例显示了如何执行此操作.(1)Ian Griffiths的帖子说我应该从套接字读取,而不是通过它发送.

Pete Duniho的另一篇文章说:

...在你打电话之后Shutdown(),打电话Receive()直到它返回0 (假设远程端点实际上不会向你发送任何东西,一旦远程端点收到你的所有数据就会发生这种情况).除非您这样做,否则您无法保证远程端点实际上已收到您发送的所有数据,即使使用延迟套接字也是如此.

我真的不明白他关于调用Receive()以确保远程端点实际上已经收到我发送的所有数据的说法.(套接字阻塞接收,直到发送缓冲区为空?)

我对提出的不同方法感到困惑.你能解释一下吗?


(1)但不知为何,例如Socket.Connected属性分配1字节的数组,即使它调用Send与0长度?

.net sockets

34
推荐指数
2
解决办法
3万
查看次数

Asycn TCP Server保持套接字但停止侦听

我有以下异步TCP服务器,我用它来接受来自想要上传文件的客户端的传入请求.大约1-4小时后,服务器只是停止接受任何新连接.这让我感到困惑,因为我无法确定性地重现错误.程序中的其余线程继续正常运行.没有任何例外.关于可能发生什么的任何建议?

在服务器崩溃之前,我所看到的是它设法完成待处理的请求然后停止.我怀疑服务器是否经常出现网络断开连接.如何使这段代码对故障更加健壮?我已经将try-catch添加到可能会失败的两段代码中,但我觉得我仍然缺少某些东西.

我设置另一个线程来检查此服务器是否释放套接字,但即使在它停止处理客户端请求后,套接字似乎仍在使用中.我用这个验证了这个netstat -a

internal class TCPServer
{
    private readonly int _listeningPort;
    private TcpListener listener;

    public TCPServer(int port)
    {
        _listeningPort = port;
        listener = new TcpListener(IPAddress.Any, _listeningPort);
        listener.Start(int.MaxValue);
    }

    public async void Start()
    {
        while (true)
        {
            Log.Verbose("Waiting for connections...");
            try
            {
                var tcpClient = await listener.AcceptTcpClientAsync();
                Task t = HandleConnectionAsync(tcpClient);
                await t;
            }
            catch (Exception exp)
            {
                Log.Fatal(exp.ToString());
            }
        }
    }

    private async Task HandleConnectionAsync(TcpClient tcpClient)
    {
        try
        {
            string outputFile = ""; // get a random string …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous tcp async-await

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

标签 统计

.net ×2

async-await ×1

asynchronous ×1

c# ×1

sockets ×1

tcp ×1