विफल रहता है मेरा कार्य टीसीपी के माध्यम से जुड़े दो कंप्यूटरों के बीच खेले गए दो खिलाड़ी गेम को कार्यान्वित करना है। आवश्यकता में से एक यह है कि केवल विजेता को फिर से पसंद किया जाता है या नहीं। यदि सर्वर जीतता है और आगे नहीं खेलता है, तो क्लाइंट को सर्वर के रूप में पुनरारंभ करना चाहिए और नए कनेक्शन स्वीकार करना चाहिए।बाइंड()
मेरा दृष्टिकोण: यदि गेम खो गया है (क्लाइंट मोड में), तो सॉकफड बंद करें और दूसरा बनाएं। फिर SO_REUSEADDR का उपयोग करके रीबंडिंग की अनुमति देने के लिए सेटॉकॉप का उपयोग करें, फिर बाध्य कॉल करें।
int yes = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
{
perror("setsockopt");
}
if (bind(sockfd, (struct sockaddr*)&svr, sizeof(svr)) == -1)
{
perror("server: bind");
}
लेकिन फिर भी, मुझे वही "पता पहले से उपयोग में है" त्रुटि मिल रही है। मैंने सॉकेट को पुनर्जीवित करने से पहले 150 सेकंड के लिए सोने की कोशिश की है और यह विधि काम करती है।
नोट: मैं इसे उसी पीसी पर परीक्षण कर रहा हूं। यह दो लिंक किए गए पीसी पर काम कर सकता है लेकिन इसे एक ही पीसी पर काम करने की आवश्यकता है। कृपया मदद करे।
के बाद अपने सर्वर को पुनरारंभ करने का प्रयास करते हैं, तो यह आपको "पता पहले से उपयोग में" त्रुटि संदेशों को प्राप्त करने में सक्षम बनाता है, कृपया अपना कोड दिखाएं (विशेष रूप से 'सेटॉकोपट() 'के आसपास का हिस्सा) ताकि हम सहायता कर सकें। –
क्या आप वाकई क्लाइंट कोड में इसे फिर से बनाने का प्रयास करने से पहले सर्वर-साइड (सॉकेट सुनना) बंद कर रहे हैं? एक लिनक्स सिस्टम पर, "netstat -tlp" को यह पहचानने के लिए एक टीसीपी पोर्ट खोलने के लिए क्या पता चलाना चाहिए ... – BRFennPocock
आप एक मशीन पर दो बार एक ही {पता, portnum} को बांधने का प्रयास करते हैं? आप क्या होने की उम्मीद करेंगे? – wildplasser