Socket.SendTimeout មិនកំណត់ការប៉ុនប៉ងភ្ជាប់តាមប្រូកស៊ីទេ
កំណត់ការពិនិត្យច្រកប្រូកស៊ីនៅពេលបង្កើតការភ្ជាប់ ជំនួសឱ្យការកំណត់ timeout ដែលអនុវត្តចំពោះតែការផ្ញើទិន្នន័យ។
កម្មវិធីពិនិត្យប្រូកស៊ីកំណត់ SendTimeout = 200 ហៅ Connect ហើយរង់ចាំយូរជាងការរំពឹងទុក។ Timeout ត្រូវបានភ្ជាប់ទៅប្រតិបត្តិការដែលកម្មវិធីពិនិត្យមិនទាន់ឈានដល់។
Socket.SendTimeout គ្រប់គ្រងការផ្ញើសមកាលកម្ម។ វាមិនផ្តល់កំណត់ពេល 200 ms ដល់ការប៉ុនប៉ងភ្ជាប់សមកាលកម្មទេ។ ការបន្ថែមការគេងមុន Connect គ្រាន់តែបន្ថែមការពន្យារពេលមួយទៀត។
បោះបង់ប្រតិបត្តិការដែលកំពុងរង់ចាំ
នៅលើគោលដៅ .NET ទំនើបដែលផ្តល់ overload ដែលអាចបោះបង់បាន ការពិនិត្យអសមកាលអាចអនុវត្តថវិការបស់ខ្លួនទៅលើការបង្កើតការភ្ជាប់៖
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
ផ្នែកនេះជាកម្មសិទ្ធិរបស់វិធី async ដោយម៉ាស៊ីនមេ និងច្រកប្រូកស៊ីត្រូវបានផ្តល់ដោយអ្នកហៅ។ បេក្ខជនសាធារណៈពីបញ្ជីប្រូកស៊ីអាចផ្តល់ធាតុបញ្ចូលទាំងពីរនេះ។ ដោះស្រាយការបោះបង់ដោយឡែកពីកំហុស socket ប្រសិនបើកម្មវិធីពិនិត្យរាយការណ៍ពីមូលហេតុបរាជ័យ។ ការបោះចោល client ក៏រារាំងការពិនិត្យដែលបានបញ្ចប់មិនឱ្យប្រមូល socket ផងដែរ។
កូដ .NET Framework ចាស់មិនមាន overload ទំនើបទាំងអស់ទេ។ ប្រើការរៀបចំការភ្ជាប់អសមកាលដែលគាំទ្រ ហើយបិទ socket យ៉ាងច្បាស់នៅពេលអ្នកបោះបង់ការប៉ុនប៉ង។ ការបញ្ឈប់ការរង់ចាំរបស់អ្នកតែម្នាក់ឯងមិនបញ្ជាក់ថាប្រតិបត្តិការមូលដ្ឋានបានឈប់ទេ។
លទ្ធផលបៃតងនៅតែជាលទ្ធផលតូច
ការភ្ជាប់ TCP ដែលជោគជ័យបញ្ជាក់ថា client នេះបានឈានដល់ចំណុចចុងក្រោយដែលកំពុងស្តាប់។ វាមិនបានចរចា SOCKS មិនបានផ្ទៀងផ្ទាត់ជាមួយប្រូកស៊ី HTTP មិនបានបើក CONNECT ឬទទួលការឆ្លើយតបគេហទំព័រដែលចង់បានទេ។
ផ្តល់ឱ្យដំណាក់កាលក្រោយៗនោះនូវការគ្រប់គ្រងមានកំណត់ដោយខ្លួនឯង ឬដឹកនាំកំណត់ពេលសរុបដោយចេតនាឆ្លងកាត់ពួកវា។ បើមិនដូច្នេះទេ កម្មវិធីកំណត់ពេលភ្ជាប់ដែលបានជួសជុលអាចដំណើរការយ៉ាងល្អឥតខ្ចោះ ខណៈដែលកម្មវិធីពិនិត្យចំណាយមួយនាទីទៀតរង់ចាំ handshake ប្រូកស៊ី។