मेरे पास एक एसएमटीपी श्रोता है जो अच्छी तरह से काम करता है लेकिन केवल एक कनेक्शन प्राप्त करने में सक्षम है। मेरा सी # कोड नीचे है और मैं इसे एक सेवा के रूप में चला रहा हूं। मेरा लक्ष्य यह है कि इसे सर्वर पर रनइन करें और इसे भेजे गए कई SMTP संदेशों को पार्स करें।मैं टीसीपी लिस्टनर को एकाधिक कनेक्शन स्वीकार करने और व्यक्तिगत रूप से प्रत्येक के साथ काम करने के लिए कैसे प्राप्त करूं?
वर्तमान में यह पहला संदेश पार्स करता है और काम करना बंद कर देता है। मैं इसे दूसरे, तीसरे, चौथे को स्वीकार करने के लिए कैसे प्राप्त कर सकता हूं ... एसएमटीपी संदेश और इसे संसाधित करता है जैसे यह पहला होता है?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace SMTP_Listener
{
class Program
{
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any , 8000);
TcpClient client;
NetworkStream ns;
listener.Start();
Console.WriteLine("Awaiting connection...");
client = listener.AcceptTcpClient();
Console.WriteLine("Connection accepted!");
ns = client.GetStream();
using (StreamWriter writer = new StreamWriter(ns))
{
writer.WriteLine("220 localhost SMTP server ready.");
writer.Flush();
using (StreamReader reader = new StreamReader(ns))
{
string response = reader.ReadLine();
if (!response.StartsWith("HELO") && !response.StartsWith("EHLO"))
{
writer.WriteLine("500 UNKNOWN COMMAND");
writer.Flush();
ns.Close();
return;
}
string remote = response.Replace("HELO", string.Empty).Replace("EHLO", string.Empty).Trim();
writer.WriteLine("250 localhost Hello " + remote);
writer.Flush();
response = reader.ReadLine();
if (!response.StartsWith("MAIL FROM:"))
{
writer.WriteLine("500 UNKNOWN COMMAND");
writer.Flush();
ns.Close();
return;
}
remote = response.Replace("RCPT TO:", string.Empty).Trim();
writer.WriteLine("250 " + remote + " I like that guy too!");
writer.Flush();
response = reader.ReadLine();
if (!response.StartsWith("RCPT TO:"))
{
writer.WriteLine("500 UNKNOWN COMMAND");
writer.Flush();
ns.Close();
return;
}
remote = response.Replace("MAIL FROM:", string.Empty).Trim();
writer.WriteLine("250 " + remote + " I like that guy!");
writer.Flush();
response = reader.ReadLine();
if (response.Trim() != "DATA")
{
writer.WriteLine("500 UNKNOWN COMMAND");
writer.Flush();
ns.Close();
return;
}
writer.WriteLine("354 Enter message. When finished, enter \".\" on a line by itself");
writer.Flush();
int counter = 0;
StringBuilder message = new StringBuilder();
while ((response = reader.ReadLine().Trim()) != ".")
{
message.AppendLine(response);
counter++;
if (counter == 1000000)
{
ns.Close();
return; // Seriously? 1 million lines in a message?
}
}
writer.WriteLine("250 OK");
writer.Flush();
ns.Close();
// Insert "message" into DB
Console.WriteLine("Received message:");
Console.WriteLine(message.ToString());
}
}
Console.ReadKey();
}
}
}
क्यों 'BeginAcceptTcpClient' के साथ नहीं? इस तरह के एक बहुत ही सरल उदाहरण में यह जरूरी नहीं है, लेकिन यदि कोई जीयूआई है, तो async 'BeginAcceptTcpClient' ठंड से बच जाएगा। – i486