2010-07-08 7 views
0

다음 코드를 작성하여 사용자로부터 암호화 된 문자열을 얻었습니다. 스레드를 사용해야합니다.tcplistener를 사용하는 멀티 스레딩

 TcpListener TCPListen = new TcpListener(IP2, port); 

     TCPListen.Start(); 


     TcpClient TCP = TCPListen.AcceptTcpClient(); 


     NetworkStream NetStream = TCP.GetStream(); 





     RijndaelManaged RMCrypto = new RijndaelManaged(); 


     byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; 
     byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; 




     CryptoStream CryptStream = new CryptoStream(NetStream, 
      RMCrypto.CreateDecryptor(Key, IV), 
      CryptoStreamMode.Read); 

     StreamReader SReader = new StreamReader(CryptStream); 

문제는 내가 TCPListen.Start(); 그렇지 않으면 오류가 발생합니다 ** (각 소켓 주소 (프로토콜/네트워크 주소/포트)의 한 가지 용도 만 정상적으로 허용됩니다) ** 이 문제를 어떻게 해결할 수 있습니까?

+0

그래서 클라이언트 연결을 수락하고 다른 스레드로 주 클라이언트가 다른 클라이언트를 받아들이도록 허용하는 TcpClient 작업을 옮기고 싶다고 생각합니다. 그게 맞습니까? –

+0

바로 !!!!!!!! – Mohammad

+1

이것은 MSDN에서 잘 설명되어 있습니다. 거기를보고 싶을 수도 있습니다. 이 질문 (http://stackoverflow.com/questions/706117/socket-programming/706154#706154)도 매우 비슷합니다. –

답변

1

또는 새 스레드를 차단 호출을 이동하는, 당신이 사용할 수있는 사용 BeginConnect, BeginReceive, BeginSend 방법 및 해당 종료 (연결 | 수신 | 보내기) here을 설명한다.

편집 : RE : 당신이 BeginConnect()을 대신 Connect()를 호출 OP ...
에서 아래 질문을 부를 것이다 누군가가 연결될 때 (에 "콜백"로 알려진)를 호출 BeginConnect()하는 방법을 제공한다. 이 콜백은 당신이해야 할 일을 무엇이든 할 수 있도록 호출됩니다. 코드에서 가장 먼저해야 할 일은 EndConnect()입니다. 문제는 반환 할 때까지 Connect() 블록 (즉, 해당 스레드의 모든 코드 실행 중단)을 호출하는 것입니다. BeginXXX()EndXXX() 단계를 사용하면이 문제가 해결됩니다. 그것의 진짜로 너무 깊이있는 주제의 어떤 유용한 깊이에서 설명하는 그것의 고기. 위에 링크 된 MSDN 문서에서 공부하십시오. 얼마간의 시간을 들여 특정 질문이 있으면 여기에 다시 게시하면 답변을 드리겠습니다. :)

+0

좀 더 자세히 설명해 주시겠습니까? – Mohammad

1

연결 요청이 대기열에 들어간 후 포트 당 하나의 수신기 만 설정하면 자신의 TCP 클라이언트가 할당됩니다. 아래 링크를 클릭하면 더 많은 정보를 얻을 수 있지만 본질적으로 다중 청취자를 붙이려 고해서는 안되며 새로운 스레드가 당신을 보냈다고 생각하지 않습니다.

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.aspx