के बाद मेरे पास दो भाग, ग्राहक और सर्वर हैं। और मैं क्लाइंट से सर्वर पर डेटा (आकार> 5840 बाइट्स) भेजने की कोशिश करता हूं और फिर सर्वर डेटा वापस भेजता है। मैं इसे हर बार एक दूसरे के बीच एक सेकंड इंतजार लूप। कुछ समय सर्वर अनुप्रयोग क्रैश, दुर्घटना बहुत यादृच्छिक लगता है त्रुटि:यादृच्छिक "रिमोट होस्ट द्वारा एक मौजूदा कनेक्शन जबरन बंद कर दिया गया था।" एक टीसीपी रीसेट
Unhandled Exception: System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. --->
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s ize)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s ize)
at TCP_Server.Program.Main(String[] args)
क्लाइंट कोड (यह पाश अंदर है):
try
{
Int32 port = 13777;
using (TcpClient client = new TcpClient(ip, port))
using (NetworkStream stream = client.GetStream())
{
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
var data = GenerateData(size);
sw.Start();
// Send the message to the connected TcpServer.
stream.Write(data, 0, data.Length);
// Buffer to store the response bytes.
data = new Byte[size];
// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);
sw.Stop();
Console.WriteLine(i + ": Done transporting " + size + " bytes to and from " + ip + " time: " +
sw.ElapsedMilliseconds + " ms");
// Close everything.
stream.Close();
client.Close();
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
sw.Reset();
सर्वर कोड:
Byte[] bytes = new Byte[size];
// Enter the listening loop.
for (int i = 0; i < numberOfPackages; i++)
{
using (TcpClient client = server.AcceptTcpClient())
using (NetworkStream stream = client.GetStream())
{
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
// Loop to receive all the data sent by the client.
while ((stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Send back a response.
stream.Write(bytes, 0, size);
}
client.GetStream().Close();
client.Close();
}
Console.WriteLine("Receive data size " + size);
}
मेरे पास है भेजे गए tcp संकुलों की निगरानी करने के लिए wireshark का उपयोग किया गया और पाया कि प्रोग्राम क्रैश होने से पहले एक टीसीपी आरएसटी क्लाइंट से सर्वर पर भेजा जाता है। तो मुझे लगता है कि समस्या यह है कि आरएसटी सही ढंग से संभाल नहीं है। क्लाइंट और होस्ट के बीच कोई फ़ायरवॉल नहीं है, इसलिए समस्या नहीं है। तो या तो मैं टीसीपी आरएसटी से छुटकारा पाने की जरूरत है या मैं अपने सर्वर की जरूरत है किसी तरह से इसे संभाल करने के लिए और क्रैश नहीं https://www.dropbox.com/sh/ctl2chq3y2c20n7/AACgIJ8IRiclqnyOyw8sqd9La?dl=0
:
दोनों क्लाइंट और सर्वर के लिए wireshark फ़ाइलें यहाँ है।
मैंने लंबे समय तक प्रतीक्षा करने का प्रयास किया है लेकिन इससे मदद नहीं मिलती है। यदि डेटा 5840 बाइट्स से नीचे है तो मुझे कोई क्रैश नहीं मिलता है, जो मुझे पता है।
कोई सुझाव या विचार?
संपादित करें: जवाब मैं इसे निम्नलिखित परिवर्तनों के साथ काम मिल गया के लिए धन्यवाद:
सर्वर:
// Loop to receive all the data sent by the client.
int k = 0;
while (k < size)
{
int bytesRead = stream.Read(bytes, 0, bytes.Length);
k += bytesRead;
}
// Send back a response.
stream.Write(bytes, 0, size);
और एक ही जब क्लाइंट की तरफ मत प्राप्त हुए। चूंकि मैं पहले सभी डेटा भेजना चाहता हूं और फिर सर्वर को मेरे आवेदन के लिए इस काम का जवाब देना चाहिए।
धन्यवाद !!! चूंकि मुझे केवल भेजने के लिए मेरे आवेदन की आवश्यकता है और फिर एक ही समय में यह प्राप्त नहीं होता है, मुझे केवल पहली समस्या को ठीक करने की आवश्यकता होती है। – TobiasW
@TobiasW मुझे लगता है कि आप डेडलॉक समस्या को समझ नहीं पाए। यह कोड यादृच्छिक रूप से डेडलॉक होगा। 100 एमबी भेजने का प्रयास करें और यह निश्चित रूप से डेडलॉक होगा। – usr
भले ही मैं पहले क्लाइंट से सबकुछ भेजूं, फिर भी सर्वर इसे वापस भेजने से पहले सबकुछ प्राप्त करता है? इसके बाद मैं इंतजार करता हूं और सबकुछ फिर से करता हूं। कोड का उपयोग वास्तविक रूप से नहीं किया जाता है, यह बेंचमार्क एप्लिकेशन से अधिक है। – TobiasW