delphi इंडी त्रुटि 10038 "गैर सॉकेट पर सॉकेट ऑपरेशन" 61 सेकंड की निष्क्रियता के बाद



ftp indy (1)

एफ़टीपी कई सॉकेट कनेक्शन का उपयोग करता है, एक आदेश / प्रतिक्रियाओं के लिए, और प्रत्येक हस्तांतरण के लिए अलग कनेक्शन

सॉकेट त्रुटि का सबसे संभावित कारण TIdFTP और एफ़टीपी सर्वर के बीच बैठे एक एफ़टीपी-अनजान प्रॉक्सी / राउटर / फ़ायरवॉल है जो निष्क्रियता की एक छोटी अवधि के बाद कमांड कनेक्शन बंद कर रहा है Unpack() (या मैनुअल पॉज़) के दौरान, कमांड कनेक्शन पर कोई आदेश / प्रतिक्रियाएं प्रेषित नहीं की जा रही हैं, यह निष्क्रिय है, और इस प्रकार इस तरह के प्रॉक्सी / राउटर / फ़ायरवॉल पर समय-समय पर बंद होने के अधीन है।

एक हस्तांतरण के दौरान, कमांड कनेक्शन बेकार बैठे हुए हैं, कोई भी FTP कमांड / प्रतिक्रियाएं उस पर प्रेषित नहीं की जा रही हैं (जब तक कि आप हस्तांतरण रद्द नहीं करते हैं), तब तक स्थानांतरण पूरा नहीं हो जाता है। एफ़टीपी-अनजान प्रॉक्सी / राउटर / फ़ायरवॉल इस समय के दौरान कमांड कनेक्शन को बंद कर सकता है।

इससे बचने के लिए, TIdFTP एक NATKeepAlive संपत्ति है जो कि टीसीपी को कमांड कनेक्शन पर रख सकते हैं, जबकि यह निष्क्रिय है। यह आमतौर पर समय से पहले बंद होने से रोकता है

हालांकि, जब TIdFTP में कोई स्थानान्तरण नहीं होता है, तो NATKeepAlive.UseKeepAlive ने कमांड कनेक्शन पर टीसीपी रख- TIdFTP को निष्क्रिय कर दिया है, अगर NATKeepAlive.UseKeepAliveNATKeepAlive.UseKeepAlive सच है। TIdFTP केवल टीसीपी के TIdFTP का उपयोग करता है, केवल धारणा के साथ कि आप एफ़टीपी कमांड के बीच लंबी देरी नहीं कर रहे हैं। यदि आपको थोड़ी देर के लिए विलंब करना है, तो या तो FTP कनेक्शन बंद करें या नियमित अंतरालों पर एक FTP कमान भेज दें (जैसे TIdFTP.Noop() / थ्रेड में TIdFTP.Noop() को कॉल TIdFTP.Noop() )।

वैकल्पिक रूप से, आप सर्वर से जुड़ने के बाद मैन्युअल रूप से टीसीपी रखने की कोशिश कर सकते हैं, और NATKeepAlive.UseKeepAlive को सेट कर सकते हैं। NATKeepAlive.UseKeepAlive को झूठ करने के लिए TIdFTP प्रत्येक स्थानान्तरण के बाद अपने आप को निष्क्रिय नहीं करेगा, उदाहरण के लिए:

function Connect2FTP(FTP: TIdFTP; RemoteFolder: string; Log: TRichLog): Boolean;      
begin
  Result := FTP.Connected;
  if not Result then
  begin         { We are not already connected }
    FTP.Host    := MyFTP;
    FTP.Username:= usr;
    FTP.Password:= psw;

    try
      FTP.Connect;
      try
        FTP.ChangeDir(RemoteFolder); 

        // send a TCP keep-alive every 5 seconds after being idle for 10 seconds
        FTP.NATKeepAlive.UseKeepAlive := False; // False by default, but just in case...
        FTP.Socket.Binding.SetKeepAliveValues(True, 10000, 5000);
      except
        FTP.Disconnect(False);
        raise;
      end;
    except
      Exit;
    end;

    Result := True;
  end;
end;

ध्यान दें कि जबकि अधिकांश प्लेटफॉर्म्स प्रति-कनेक्शन आधार पर टीसीपी रख-रखाव को सक्षम करने के लिए समर्थन करते हैं (रख-अलॉइंस टीसीपी स्पेस का हिस्सा हैं), रख-जिंदा अंतराल सेट करना प्लेटफ़ॉर्म-विशिष्ट है इस समय, इंडी को अंतराल पर सेट करने का समर्थन करता है:

  • Windows 2000+ और WinCE 4.x +, Win32 और .NET के लिए
  • लिनक्स, जब इंडी काइल्िक्स में प्रयोग किया जाता है
  • यूनिक्स / लिनक्स और नेटबीएसडी, जब इंडी फ्रीपस्कल में उपयोग किया जाता है

अन्यथा, OS डिफ़ॉल्ट अंतराल का उपयोग किया जाता है, जो ओएस कॉन्फ़िगरेशन के आधार पर, इस स्थिति के लिए मूल्य में बहुत अधिक या अधिक नहीं हो सकता है

इस समय, विंडोज के अलावा डेल्फी फ़ायरमॉन्की में अंतराल अनुकूलन योग्य नहीं है।

यदि कोई विशेष प्लेटफ़ॉर्म कस्टम टीसीपी रखने-जीवित अंतराल को सेट करने का समर्थन करता है, लेकिन इंडी ने उन्हें SetKeepAliveValues() में लागू नहीं किया है, तो आप आवश्यकतानुसार मैन्युअल रूप से मान सेट करने के लिए TIdFTP.Socket.Binding.SetSockOpt() उपयोग कर सकते हैं। कई प्लेटफॉर्म TCP_KEEPIDLE / TCP_KEEPINTVL या समकक्ष सॉकेट विकल्प का समर्थन करते हैं

मैं एक FTP सर्वर से कुछ बड़ी फ़ाइलें (जीबी) डाउनलोड करना चाहता हूँ पहली फ़ाइल का डाउनलोड हमेशा कार्य करता है फिर जब मैं दूसरी फ़ाइल प्राप्त कर रहा हूं,

"सॉकेट त्रुटि # 10038। गैर सॉकेट पर सॉकेट ऑपरेशन।"

त्रुटि 'जाओ' पर है 'जाओ' के बाद मुझे ये संदेश दिखाई देते हैं (एफ़टीपी स्थिति की घटना के माध्यम से):

   Starting FTP transfer
   Disconnecting.
   Disconnected.

कोड ऐसा है:

{pseudo-code}
for 1 to AllFiles do 
 begin 
   if Connect2FTP then 
    begin
     FTP.Get(Name, GzFile, TRUE, FALSE);  <--- Socket operation on non-socket" error (I also get EIdConnClosedGracefully 'Connection Closed Gracefully' in IDE, F9 will resume execution without problems, but this is OK)
     Unpack(GzFile); <--- this takes more than 60 seconds
    end;
 end;
if FTP.Connected
then FTP.Disconnect;

-

function Connect2FTP(FTP: TIdFTP; RemoteFolder: string; Log: TRichLog): Boolean;      
begin
 Result:= FTP.Connected;
 if NOT Result then
  begin         { We are already connected }
   FTP.Host    := MyFTP;
   FTP.Username:= usr;
   FTP.Password:= psw;

   TRY
    FTP.Connect;
   EXCEPT
    on E: Exception DO

   Result:= FTP.Connected;
   if Result then FTP.ChangeDir(RemoteFolder); 
  end;
end;

यहां पूर्ण कोड: http://pastebin.com/RScj86R8 (पीएएस) या यहां https://ufile.io/26b54 (ज़िप)

मुझे लगता है कि समस्या 'अनपैक' को कॉल करने के बाद दिखाई देती है, जिसमें कुछ मिनट लगते हैं।

अद्यतनः कन्फर्म किया गया: समस्या 'अनपैक' को कॉल करने के बाद दिखाई देती है मैंने फोन हटा दिया और सब कुछ ठीक है। थोड़ी देर के लिए डाउनलोड के दौरान प्रोग्राम (सो या ब्रेक प्वाइंट) को रोकना (मुझे लगता है कि 60 से अधिक सेकंड के लिए) एक ही समस्या पैदा करेगा