나는 TcpListener
과 sockets
을 알지 못한다.하지만 때때로 내 Initializer 클래스에서 내 Wcf 프로젝트의 App_Code에서 올바르게 실행되는 다음 코드를 가지고있다. 때때로 오류가 발생하고 패턴없이 다른 패턴을 올바르게 실행합니다.TcpListener.AcceptSocket produce InvalidOperationException
이 줄을 코드에서 오류 중지 :
추가 정보 : 다음
Socket soc = listener.AcceptSocket();
그리고이이 추가적으로 정보를 표시하지 듣기에. 이 메서드를 호출하기 전에 Start() 메서드를 호출하십시오.
그러나 내가 listener.AcceptSocket() & hellip 전에 start 메소드를 호출하는 것을 볼 수 있습니다.
나는 이것이 WCF 프로젝트에서 init 데몬을 시작하려고 시도한 것으로 의심된다. 이것은 WCF 프로그램의 경우, 직접 Socket
또는 TcpListener
을 사용하는 이유
public static void AppInitialize()
{
// This will get called on startup
new Initializer().StartListener();
}
static TcpListener listener;
const int LIMIT = 5; //5 concurrent clients
private void StartListener()
{
List<int> puertos = new List<int>();
puertos.Add(5494);
puertos.Add(5495);
puertos.Add(5496);
puertos.Add(5497);
foreach (int puerto in puertos)
{
IPAddress localAddr = IPAddress.Parse(ConfigurationManager.AppSettings["ServerIP"]);
listener = new TcpListener(localAddr, puerto);
listener.Start();
for (int i = 0; i < LIMIT; i++)
{
Thread t = new Thread(new ThreadStart(Service));
t.Start();
}
}
}
private void Service()
{
while (true)
{
//Error happen hear, but listener.Start execute before... .
Socket soc = listener.AcceptSocket();
try
{
byte[] resp = new byte[2000];
var memStream = new MemoryStream();
var bytes = 0;
NetworkStream s = new NetworkStream(soc);
StreamReader sr = new StreamReader(s);
while (true)
{
string trama = "";
if (s.CanRead)
{
do
{
bytes = s.Read(resp, 0, resp.Length);
trama = Util.Util.ByteArrayToHexString(resp);
}
while (s.DataAvailable);
}
if (trama == "" || trama == null) break;
}
s.Close();
}
catch (Exception e)
{
}
finally
{
soc.Close();
}
}
}
니스, 이것은 내 다른 가정, 스레드의 나쁜 사용, 지금 나는 WCF 중요하지 않습니다 여기, 감사합니다. –
_ "지나치게 광범위하게 보이는 스레드에 대한 정보를 좀 더 보내 주시겠습니까?" Stack Overflow에 대한 주제가 될 스레드에 대해 _specific_ 질문이있는 경우 새로운 질문으로 게시하는 것이 좋습니다. –