C# - Eine vorhandene Verbindung wurde zwangsweise geschlossen durch remote-host: socket-Programmierung
Ich arbeite mit sockets. Hier sind meine codes (die Beschreibung des Problems ist weiter):
Client-Seite:
public void ReadCallback(IAsyncResult ar)
{
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
receivedPath = mypath + @"XML\";
if (!Directory.Exists(receivedPath))
{
Directory.CreateDirectory(receivedPath);
}
receivedPath = receivedPath + fileName;
flag++;
}
if (flag >= 1)
{
BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
if (flag == 1)
{
writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
flag++;
}
else
writer.Write(state.buffer, 0, bytesRead);
writer.Close();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
else
{
// Invoke(new MyDelegate(LabelWriter));
}
}
Ich bekomme Fehler auf dieser Linie: int bytesRead = handler.EndReceive(ar);
Wie kann ich diesen Fehler vermeiden?: An existing connection was forcibly closed by the remote host
Server-Seite:
public void ReadCallback(IAsyncResult ar)
{
try
{
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
string[] str = new string[2];
str = handler.RemoteEndPoint.ToString().Split(':');
IP = str[0].ToString();
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
string[] getIP = new string[3];
getIP = fileName.Split('_');
#region Send Files in HandHeld
#region GetLoginFile
if (getIP[1].ToString().Equals("GetLoginFile"))
{
string getDirectory = @"Send_Hand_Held_Files\" + DateTime.Today.ToString("dd-MM-yyyy") + "\\" + getIP[0].ToString() + "\\XML";
string strmyFile = getDirectory + "\\Login.xml";
char[] delimiter = splitter.ToCharArray();
split = strmyFile.Split(delimiter);
int limit = split.Length;
fName = split[limit - 1].ToString();
byte[] LoginfileName = Encoding.UTF8.GetBytes(fName); //file name
byte[] fileData = File.ReadAllBytes(strmyFile);
byte[] LoginfileNameLen = BitConverter.GetBytes(LoginfileName.Length); //lenght of file name
clientData = new byte[4 + LoginfileName.Length + fileData.Length];
LoginfileNameLen.CopyTo(clientData, 0);
LoginfileName.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + LoginfileName.Length);
handler.BeginSend(clientData, 0, clientData.Length, 0, new AsyncCallback(SendCallBack), handler);
//handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
//new AsyncCallback(ReadCallback), state);
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//SendData(IP);
}
private static void SendCallBack(IAsyncResult ar)
{
try
{
//Retrieve the socket from the state object.
Socket client = (Socket)ar.AsyncState;
//Complete sending the data to the remote device.
//int bytesSent = client.EndSend(ar);
//Console.WriteLine("Sent {0} bytes to server.", bytesSent);
//Signal that all bytes have been sent.
allDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
- Uhm... nicht gewaltsam schließen Sie die Verbindung auf dem remote-host?
- Sind Sie der einzige client auf den server zugreifen? Könnte es sein, dass der server überschritten hat, die Anzahl von verbindungen zulässig? Wenn Sie Zugriff auf den server-code, weißt du, wenn es immer heißt?
- gibt es andere clients verfügbar sind, wer Zugang zum server.
- In Ihrem
SendCallBack
du auskommentiert den Anruf derEndSend()
. Ich glaube nicht, dass das eine gute Idee.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie immer eine Ausnahme von
handler.EndReceive()
. Zwar ist es unklar warum, die Sie erhalten, die bestimmte Ausnahme, die Sie erwähnt, wenn in der Produktion dieser code wird Ausnahmen jedes mal gibt es ein Netzwerk-problem in der Kommunikation (das ist üblich).Daher, Sie wahrscheinlich sollte setzen Sie einen try/catch um den Aufruf zu
EndReceive()
sowieso. Überlegen Sie, was Ihr code tun müssen, würde, wenn die Verbindung fehlschlägt oder der server stirbt oder was auch immer.Dann können Sie beginnen, die Diagnose spezifischer Probleme. Eine wichtige Sache, die Sie noch nicht angegeben: bekommst du diese Fehlermeldung nur gelegentlich oder machen Sie reproduzierbar bekommen es die ganze Zeit? Wenn es ersteres ist, dann könnte es nur sein, normale Internet-Konnektivität Schwankungen. Ihre software muss in der Lage sein, zu behandeln die. Wenn letzteres, dann denke ich, es klingt wie ein problem auf dem server. Wenn Sie anrufen
BeginReceive()
wird Ihr system starten, etwas zu warten, von dem server; wenn dieses "etwas" ist, dass es Daten empfangen, dannEndReceive()
erfolgreich sein wird, aber wenn dieses "etwas" ist, dass der server die Verbindung geschlossen, der callback wird immer noch aufgerufen werden, und dannEndReceive()
werfen den relevantenSocketException
. Dies ist beabsichtigt, denn es gibt so ziemlich keinen anderen Weg, um zu kommunizieren, um Ihren code, den der server hat die Verbindung geschlossen.EDIT: Sieht aus wie Ihre server-code muss die gleichen Fehler der Handhabung: der Aufruf
EndReceive()
ist gleichermaßen anfällig für eine Ausnahme auslösen, wenn die client wird die Verbindung geschlossen. (Ich weiß, Sie haben ein try/catch um die ganze große Sache, aber es gibt eine MessageBox... das wird nicht gut funktionieren auf einem server, es sei denn, du willst, dass jemand dort sitzt die ganze Zeit mit einem Klick auf alle OK,...)Basierend auf Ihrem Fehler, ich bin nicht sicher, ob das problem mit Ihrem code, kann es auf dem server. Über das hinzufügen von einige Zustand überprüfen, um zu überprüfen, dass
handler.EndReceive(ar)
zurück, etwas sinnvolles, werden Sie wahrscheinlich benötigen, um zu überprüfen, den server selbst (oder Fragen Sie die Leute, die behaupten es zu tun), um zu sehen, warum es dem schließen der Verbindung auf Sie.Am Ende das problem, der code könnte in deinem ursprünglichen code, statt in diesem Stück: sagen Sie, wenn dem ersten Aufruf der server ist zu lang und führt zu einem timeout oder deadlock.