system-design-bangla

একাধিক প্রসেস কিংবা থ্রেড একই পোর্ট বিন্ড করার চেষ্টা করে থাকলে কি হয়?

আমরা অনেক সময় দেখতে পাই, Error: listen EADDRINUSE: address already in use 0.0.0.0:3000

কারণ #১: অন্য কোনো প্রসেস ইতিমধ্যেই সেই পোর্টে চলমান

যদি একই পোর্টে অন্য কোনো প্রোসেস কাজ করছে, তাহলে নতুন সার্ভার সেই পোর্টে bind করতে পারবে না। এই প্রসেসটি খুঁজে বের করে terminate করতে হবে।

কারণ #২: আগের প্রসেস সম্প্রতি বন্ধ হয়েছে, কিন্তু পুরানো socket এখনও TIME_WAIT স্টেটে আছে

TIME_WAIT হলো TCP connection এর একটি স্টেট, যা তখন ঘটে যখন connection সক্রিয়ভাবে (actively) বন্ধ করে। যখন connection বন্ধ হয়, operating system তৎক্ষণাৎ পোর্টটি ফ্রি করে না। বরং কিছু সময়ের জন্য (প্রায় এক মিনিট বা কম) সেই পোর্টকে reserved রাখে।

এর মূল উদ্দেশ্য হলো: বন্ধ হওয়া connection থেকে যদি কোনো delayed বা late packet আসে, তা নতুন connection এর সঙ্গে মিশে না যায়। এইভাবে network reliability বজায় থাকে এবং পুরনো ডেটা নতুন connection কে কনফিউজ করতে পারে না।

সাধারণত, যদি একই পোর্টে আবার সার্ভার চালাতে চাও, এবং পুরনো connection এখনও TIME_WAIT-এ থাকে, তখন “Address already in use” এরর দেখা দিতে পারে।