Comment réparer “une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement après une période de temps ...” d'erreur?

Je suis en train de faire un jeu en C# et je veux afficher le progrès (mouvements et ainsi de suite) de l'adversaire. J'ai donc envoyer des événements dans le jeu via le protocole TCP à l'adversaire.

J'ai déjà essayé de faire de mon application sur localhost et cela fonctionne, mais lorsque j'essaie d'utiliser mon adresse externe pour communiquer sur internet je reçois le message d'erreur ci-dessous dans la classe TcpInformer.Connect():

une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement après une
période de temps, ou une connexion établie a échoué car l'hôte connecté n'a pas
répondre (mon adresse IP externe):(port)

Je pensais que le problème était que j'étais derrière un NAT. Mais j'ai déjà mis en place le transfert de ports pour le port 49731 sur IP 10.0.0.1 et rien n'a changé.

Mon deuxième deviner était le pare-feu Windows, mais même quand j'ai arrêté le pare-feu de mon application n'a pas commencer à travailler.

Mon code pour la connexion de deux Ordinateurs est:


TcpInformer peer;
TcpHost server;
public void PrepareConnection() //for server (host)
{
playerType = PlayerType.One;
server = new TcpHost(form, this);
server.Start("10.0.0.1", 49731);
}
public void PrepareConnection2() //for client
{
playerType = PlayerType.Two;
peer = new TcpInformer(form, this);
peer.Connect("MY EXTERNAL IP", 49731);
}
//classes TcpHost and TcpInformer
public interface ITcpCommunication
{
#regionOperations(3)
void ReadData();
void SendData(byte[] message);
void SendData(byte[] message, int size);
#endregionOperations
}
public class TcpInformer : ITcpCommunication
{
#regionFields(9)
private NetworkStream con_ns;
private TcpClient con_server;
private bool connected;
private Fmain form;
private SecondPlayer player;
private int port;
private string server;
private string stringData;
#endregionFields
#regionDelegatesandEvents(1)
//Events(1)
public event SimulationEventHandler ReadEvent;
#endregionDelegatesandEvents
#regionConstructors(1)
public TcpInformer(Fmain form, SecondPlayer player)
{
this.form = form;
connected = false;
this.player = player;
}
#endregionConstructors
#regionMethods(6)
//PublicMethods(5)
///
///
///
///e.g., server = "127.0.0.1"
///e.g., port = 9050
public void Connect(string server, int port) 
{
this.port = port;
this.server = server;
connected = true;
try
{
con_server = new TcpClient(this.server, this.port);
}
catch (SocketException ex)
{
connected = false;
MessageBox.Show("Unable to connect to server" + ex.Message);
return;
}
con_ns = con_server.GetStream();
}
public void Disconnect()
{
form.Debug("Disconnecting from server...", "Player2Net");
con_ns.Close();
con_server.Close();
}
public void ReadData()
{
if (con_ns != null)
{
if (con_ns.DataAvailable)
{
byte[] data = new byte[1200];
int received = con_ns.Read(data, 0, data.Length);
player.ProcessReceivedData(data, received);
}
}
else
{
form.Debug("Warning: con_ns is not inicialized.","player2");
}
}
public void SendData(byte[] message)
{
con_ns.Write(message, 0, message.Length);
con_ns.Flush();
}
public void SendData(byte[] message, int size)        
{
if (con_ns != null)
{
con_ns.Write(message, 0, size);
}
}
//PrivateMethods(1)
private void Debug(string message)
{
form.Debug("Connected to: " + server + "port: " + port.ToString() + ": " + message, "Player2Net");
}
#endregionMethods
}
public class TcpHost : ITcpCommunication
{
#regionFields(9)
private ASCIIEncoding enc;
private Fmain form;
private TcpListener listener;
private SecondPlayer player;
private int port;
private Socket s;
private string server;
private bool state;
#endregionFields
#regionDelegatesandEvents(1)
//Events(1)
public event SimulationEventHandler ReadEvent;
#endregionDelegatesandEvents
#regionConstructors(1)
public TcpHost(Fmain form, SecondPlayer player)
{
this.player = player;
this.form = form;
state = false;
enc = new ASCIIEncoding();
}
#endregionConstructors
#regionMethods(5)
//PublicMethods(5)
public void Close()
{
state = false;
s.Close();
listener.Stop();
}
public void ReadData()
{
if (state == true)
{
if (s.Available > 0) //if there's any data
{
byte[] data = new byte[1200];
int received = s.Receive(data);
player.ProcessReceivedData(data, received);
}
}
}
public void SendData(byte[] message)
{
if (state == true)
{
s.Send(message);
}
}
public void SendData(byte[] message, int size)
{
if (state == true)
{
s.Send(message, size, SocketFlags.None);
}
}
public void Start(string p_ipAddress, int listenPort)
{
//IPAddress ipAddress = IPAddress.Loopback
IPAddress ipAddress = IPAddress.Parse(p_ipAddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, listenPort); 
//listener = new TcpListener(ipAddress, listenPort);
listener = new TcpListener(ipLocalEndPoint);
server = "[provider]";
port = listenPort;
listener.Start();
form.Debug("Server is running", "Player1Net");
form.Debug("Listening on port " + listenPort, "Player1Net");
form.Debug("Waiting for connections...", "Player1Net");
s = listener.AcceptSocket();
form.Debug("Connection accepted from " + s.RemoteEndPoint, "Player1Net");
state = true;
}
#endregionMethods
}

Est-il un moyen de vérifier ce qui est mal?
L'aide est très apprécié!

J'ai trouvé quel était le problème. J'ai été à l'écoute sur 10.0.0.1 et essayer d'atteindre mon IP externe (deuxième instance de mon programme), ce qui est impossible sur un ordinateur avec une connexion à internet. Devrais-je supprimer ce post?
Ajouter votre propre réponse expliquant la solution, et le marquer comme étant accepté.
laisser ce post. Cela a été utile pour moi.

OriginalL'auteur Martin Vseticka | 2009-07-27