2010-08-03 13 views
21

मैं लिनक्स से विंडोज तक कुछ सॉकेट कोड पोर्ट कर रहा हूं।मैं WSAGetLastError() से त्रुटि स्ट्रिंग कैसे प्राप्त करूं?

लिनक्स में, मैं एक त्रुटि-कोड को मानव-पठनीय स्ट्रिंग में परिवर्तित करने के लिए strerror() का उपयोग कर सकता था।

एमएसडीएन दस्तावेज WSAGetLastError() से लौटाए गए प्रत्येक त्रुटि कोड के बराबर तार दिखाता है, लेकिन मुझे उन तारों को पुनर्प्राप्त करने के बारे में कुछ भी नहीं दिखाई देता है। क्या strerror() यहां भी काम करेगा?

मैं विंसॉक से मानव-पठनीय त्रुटि तारों को कैसे प्राप्त कर सकता हूं?

उत्तर

14

WSAGetLastError के लिए प्रलेखन के रूप में कहते हैं कि आप त्रुटि संदेश का टेक्स्ट संस्करण प्राप्त करने के लिए FormatMessage का उपयोग कर सकते हैं।

आपको को dwFlags पैरामीटर में सेट करने और dwMessage पैरामीटर के रूप में त्रुटि कोड को पास करने की आवश्यकता है।

+1

धन्यवाद - मैंने अभी खुद को खोज लिया है। मुझे ऑनलाइन एमएसडीएन देखने के लिए याद रखना होगा (बनाम मेरे लैपटॉप पर ऑफ़लाइन प्रतिलिपि बनाम!)। –

27
wchar_t *s = NULL; 
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
       NULL, WSAGetLastError(), 
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
       (LPWSTR)&s, 0, NULL); 
fprintf(stderr, "%S\n", s); 
LocalFree(s); 
+2

'& s' तर्क को यहां एलपीटीस्ट्रस्ट में डाला जाना चाहिए क्योंकि यह फ़ंक्शन एक पैरामीटर के साथ स्ट्रिंग के लिए एक पॉइंटर लौटने वाले इस पैरामीटर के साथ एक हैक का उपयोग करता है। –

+1

केवल तभी जब आप FormatMessageW को FormatMessage में बदलते हैं। अन्यथा, आपको अपने विजुअल स्टूडियो प्रोजेक्ट में सेटिंग्स के आधार पर एलपीडब्लूस्ट्रेट के बजाय डालने की आवश्यकता हो सकती है। –

+0

मैंने कास्ट को 'एलपीडब्लूस्ट्र' में शामिल करने के लिए उत्तर संपादित किया, अन्यथा संकलक विफल रहता है – SailAvid

2

एक mxcl का जवाब है, जो malloc/मुक्त और जोखिम निहित उसमें के लिए की जरूरत निकाल देता है, और जिनमें से थोड़ा सरल संस्करण इस मामले में जहां कोई संदेश पाठ उपलब्ध है संभालती है (के बाद से माइक्रोसॉफ्ट दस्तावेज़ नहीं पड़ता कि तब होता है):

int 
    err; 

char 
    msgbuf [256]; // for a message up to 255 bytes. 


msgbuf [0] = '\0'; // Microsoft doesn't guarantee this on man page. 

err = WSAGetLastError(); 

FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // flags 
       NULL,    // lpsource 
       err,     // message id 
       MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // languageid 
       msgbuf,    // output buffer 
       sizeof (msgbuf),  // size of msgbuf, bytes 
       NULL);    // va_list of arguments 

if (! *msgbuf) 
    sprintf (msgbuf, "%d", err); // provide error # if no string available 
संबंधित मुद्दे