2017-01-21 1 views
1

의 다른 네트워크를 통한 통신 TCP/IP를 사용하여 클라이언트와 서버 간의 통신을 설정할 수 있습니다. 클라이언트와 서버는 서버와 클라이언트가 같은 네트워크에있는 경우에만 서로 메시지를 보내고받을 수 있습니다. if 둘 다 다른 네트워크에 있고 클라이언트가 서버에 연결하지 않습니다. 서로 다른 네트워크에있을 때 무엇을해야합니까? 도와주세요. 서버 코드와 클라이언트 코드가 있습니다. 감사합니다.TCP/IP 클라이언트 서버 C#

//Server Code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Net; 
using System.IO; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     try 
     { 
      IPAddress ipAd = IPAddress.Parse("192.168.0.110"); //use local  m/c IP address, and use the same in the client 

      /* Initializes the Listener */ 
      TcpListener myList = new TcpListener(ipAd, 8001); 

      /* Start Listeneting at the specified port */ 
      myList.Start(); 

      Console.WriteLine("The server is running at port 8001..."); 
      Console.WriteLine("The local End point is :" + myList.LocalEndpoint); 
      Console.WriteLine("Waiting for a connection....."); 

      Socket s = myList.AcceptSocket(); 
      Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); 

      byte[] b = new byte[100]; 
      int k = s.Receive(b); 
      Console.WriteLine("Recieved..."); 
      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(b[i])); 
      Console.WriteLine("Enter the string to be strasmitted"); 

      String str = Console.ReadLine(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      s.Send(asen.GetBytes(str)); 
      Console.WriteLine("\nSent Acknowledgement"); 
      /* clean up */ 
      s.Close(); 
      myList.Stop(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
     Console.ReadLine(); 
    } 

    } 
    } 

    //Client Code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.IO; 
using System.Net.Sockets; 

namespace ConsoleApplication4 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      TcpClient tcpclnt = new TcpClient(); 
      Console.WriteLine("Connecting....."); 

      tcpclnt.Connect("192.168.0.110", 8001); // use the ipaddress as in the server program 

      Console.WriteLine("Connected"); 
      Console.Write("Enter the string to be transmitted : "); 

      String str = Console.ReadLine(); 
      Stream stm = tcpclnt.GetStream(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] ba = asen.GetBytes(str); 
      Console.WriteLine("Transmitting....."); 

      stm.Write(ba, 0, ba.Length); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(bb[i])); 

      tcpclnt.Close(); 
     } 

     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
     Console.ReadLine(); 
    } 
    } 
} 

답변

0

서버가 클라이언트가 IP와 서버에 연결 192.168.0.110 포트 8001

IPAddress ipAd = IPAddress.Parse("192.168.0.110"); 
TcpListener myList = new TcpListener(ipAd, 8001); 

에서 연결을 수신하는 것입니다 : 192.168.0.110. 서버가 동일한 네트워크에 있습니다. 따라서 서버가 켜져 있고 연결을 수신하는 경우이 방법이 작동합니다.

tcpclnt.Connect("192.168.0.110", 8001); 

그래서 모든 것이 괜찮 그러나 당신의 클라이언트가 다른 네트워크에있는 경우는 클라이언트가 IP를 찾습니다 때문에 당연히 서버를 찾을 수 없습니다 : 로컬 네트워크에 192.168.0.110:8001 (로컬 서버 IP)와이 그것을들을 서버가 없습니다.

이 작업을하려면 라우터를 서버의 네트워크에 포트 포워딩해야합니다. 포트에 들어오는 모든 연결이 8001 인 라우터에 192.168.0.110:8001 (로컬 서버 IP)으로 리디렉션되도록 설정합니다.

공용 IP 당신이 당신의 클라이언트가이 같은 연결할 수 있어야하는 것보다 10.10.10.10 경우 예를 들어

: 클라이언트가 10.10.10.10:8001에 연결하는 경우

tcpclnt.Connect("10.10.10.10", 8001); 

그래서 라우터가 로컬 네트워크와 클라이언트에서 서버로 리디렉션됩니다 서버에 연결할 수 있습니다.

/*Server example for listening. (IPAddress.any) means any IP will be allowed to connect*/ 
TcpListener myList = new TcpListener(IPAddress.Any,8001); 

!! 앞으로 이동하는 방법은 모든 라우터마다 다르기 때문에 google에서 빠른 검색을 수행하면 도움이됩니다.

+0

내 실수는 클라이언트와 서버 코드에서 동일한 IP를 사용하고 있지만 틀린 posts.i는 내 질문을 바로 지금 수정했습니다. 주어진 해결책을 시도 할 것입니다. –

+0

문제는 없으며 코드를 업데이트했습니다. 하지만이 솔루션은 똑같은 방식으로 작동하지만 socked 클래스보다 효과적입니다. 그래서 나는 그것이 효과가 있는지 궁금해 할 것입니다. –

+0

@Timson Post 여전히 작동하지 않습니다. 나는 라우터에 액세스 할 수 없다고 말한대로 포트 포워딩 부분을 수행하지 않았습니다. Windows 호스트 파일에서 일부 변경을 수행하는 것과 같은 다른 방법으로 포트 포워딩을 수행합니다. –