TcpListener没有从SmtpClient接收到任何数据

时间:2018-08-07 08:53:47

标签: c# networking tcp smtp smtpclient

我正试图解决导致SMTP服务器的奇怪问题,该问题通常用于为我自己的电子邮件地址返回“未知收件人”消息。在生产环境中,我使用其他SMTP服务器,因此这只会阻止我的测试。

我试图使用Fiddler分析流量,但显然Fiddler并未检测到任何SMTP流量。我没有接受过WireShark的培训,这只是一个很小的项目,我不能花很多时间,所以我认为我只是将一个小型TCP服务组合在一起,而不是只是看看我使用的SmtpClient实例正在发送什么

这是TcpListener代码...

class Service
{
    public Task Listen(int port, CancellationToken ct, TcpHandler tcpHandler = null)
    {
        tcpHandler = tcpHandler ?? defaultTcpHandler;
        return Task.Run(async () => 
        {
            var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
            var listener = new TcpListener(endpoint);
            listener.Start();
            try
            {
                while (!ct.IsCancellationRequested)
                {
                    var client = await listener.AcceptTcpClientAsync();
                    handleRequestAsync(client, tcpHandler, ct);
                }
                listener.Stop();
            }
            catch (SocketException ex)
            {
                Console.WriteLine($"SocketException: {ex}");
            }
            finally
            {
                listener.Stop();
            }
        }, 
        ct);
    }

    void handleRequestAsync(TcpClient client, TcpHandler tcpHandler, CancellationToken ct)
    {
        Task.Run(async () => 
        {
            var stream = client.GetStream();
            if (!stream.CanRead)
                return;

            var sb = new StringBuilder();
            var buffer = new byte[4096];
            int receivedCount;
            while ((receivedCount = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
            {
                var received = Encoding.ASCII.GetString(buffer, 0, receivedCount);
                sb.Append(received);
            }
            var request = sb.ToString();
            if (request.Length != 0 && tcpHandler(sb.ToString(), out var response))
            {
                var send = Encoding.ASCII.GetBytes(response);
                stream.Write(send, 0, send.Length);
                stream.Flush();
            }
            client.Close();
        });
    }

是的,该代码非常幼稚,没有真正的错误处理等。但是,这只是查看发送内容的一种方式。问题是对stream.ReadAsync的调用会阻塞并且永远不会返回。我还检查了TcpClient.Available属性,它返回零(0)。最终,SmtpClient超时,似乎什么也没有发送。我还没有深入研究SMTP协议,所以也许我遗漏了一些东西?在通过SmtpClient发送数据之前,我是否需要以某种方式确认连接?

多年来我一直没有做太多的网络编码,而且我从来都不是这个领域的忍者。任何指针或提示将不胜感激。

干杯!

0 个答案:

没有答案