2013-11-10 2 views
0

Я создаю небольшой сервер для нескольких клиентов winform, подключающихся к нему через Интернет. Следующий код работает, когда он установлен на локальный адрес:Исправление причины из исключения Socket в C#

Сервер:

static void Main(string[] args) 
{ 
    TcpListener serverSocket = new TcpListener(9000); 
    TcpClient clientSocket = default(TcpClient); 
    int counter = 0; 

    serverSocket.Start(); 
    Console.WriteLine("Chat Server Started ...."); 
    counter = 0; 
    while ((true)) 
    { 
     counter += 1; 
     clientSocket = serverSocket.AcceptTcpClient(); 

     byte[] bytesFrom = new byte[10025]; 
     string dataFromClient = null; 

     NetworkStream networkStream = clientSocket.GetStream(); 
     networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
     dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
     dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 

     clientsList.Add(dataFromClient, clientSocket); 

     broadcast(dataFromClient + " Joined ", dataFromClient, false); 

     Console.WriteLine(dataFromClient + " Joined chat room "); 
     handleClinet client = new handleClinet(); 
     client.startClient(clientSocket, dataFromClient, clientsList); 
    } 

    clientSocket.Close(); 
    serverSocket.Stop(); 
    Console.WriteLine("exit"); 
    Console.ReadLine(); 
} 

Winform Клиент:

public partial class Form1 : Form 
{ 
    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
    NetworkStream serverStream = default(NetworkStream); 
    string readData = null; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     readData = "Conected to Chat Server ..."; 
     msg(); 
     clientSocket.Connect("127.0.0.1", 9000); 
     serverStream = clientSocket.GetStream(); 

     byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox3.Text + "$"); 
     serverStream.Write(outStream, 0, outStream.Length); 
     serverStream.Flush(); 

     Thread ctThread = new Thread(getMessage); 
     ctThread.Start(); 
    } 
} 

Те кусок кода работает отлично разговаривать друг с другом по сети , Но когда я решил изменить эту строку кода

clientSocket.Connect("127.0.0.1", 9000); в clientSocket.Connect("81.62.126.41", 9000);

мой IP-адрес он дает мне следующую SocketException:

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Таким образом, некоторые вещи, которые я пытался , Порт переадресации портов 9000, потому что я за моим маршрутизатором. Создание правил входящего и исходящего трафика для порта 9000. И я перешел на http://www.canyouseeme.org/, пока мой сервер запущен, и веб-сайт действительно может видеть мой сервис.

Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?

Вот скриншот netstat, когда сервер работает. Думал, что это может быть полезно. enter image description here

+0

Основываясь на вашем описании, что-то блокирует IP-пакеты на ваш хост или с вашего компьютера. Попробуйте использовать Wireshark или Microsoft Network Monitor для просмотра пакетов на вашем хосте, он должен указывать вас в направлении, где пакеты фильтруются. – William

+0

@William Нет идеи, что это такое, но я проверю это. –

+0

@William Я использую Wireshark, и мне удалось захватить пакет и информацию, которые я хочу, но я понятия не имею, что я должен искать. –

ответ

0

У меня была аналогичная проблема.

  1. Если вы изменяете только одну строку в своем коде, и она перестает работать с двойной проверкой инструментов, которые вы используете. Некоторые внутренние прокси могут разрешить/запретить вам общаться с внутренним (127.0.0.1) или внешним ip.
  2. Проверьте тот же URL-адрес в своем браузере 127.0.0.1:9000 и 81.62.126.41:9000. Если он не открывается для второго случая, то вы можете указать в своем брандмауэре или настроить свой сервер для внешнего доступа, а не в вашем коде.
  3. Ваше исключение означает, что с вашим сервером что-то не так: вы можете попробовать открыть http://81.62.12.32/ и открыть http://81.62.126.41:9000/, и вы увидите две разные ошибки.

Заключение: проблема не в вашем коде. Он находится в настройках вашего веб-сервера или в настройках брандмауэра.

Смежные вопросы