לחלונות יש סט של פקודות שמכונה “WinSock”. הרבה מהפקודות שם מועתקות מהתקן של יוניקס (Posix), אבל ניחא. אחת הפקודות שם, שדווקא אינה לקוחה מיוניקס, הינה “WSAGetLastError”. הרעיון הוא שהפקודה הזו מחזירה את השגיאה האחרונה שארעה.
אני לא מדבר על זה שביוניקס יש את errno שעושה את אותו הדבר.
אני לא מדבר על זה של-Winsock יש errno.
אני אפילו לא מדבר על זה ש-Winsock לא מעדכן את errno, אחרי שטרח כל כך קשה כדי לוודא שהוא קיים.
אני מדבר על זה שבחלונות יש גם פונקציה שנקראת “GetLastError”. היא עושה את אותו הדבר, רק שלקריאות מערכת שאינן של Winsock. למה, אתם שואלים, יש סט נפרד (ולא תואם) רק עבור Winsock? לא יודע.
אבל אפילו על זה אני לא מדבר באמת.
אני מדבר על זה שהמימוש של WSAGetLastError הוא פשוט קריאה ל-GetLastError. כן, כן. מיקרוסופט הגדירו שתי פונקציות נפרדות, שעושות בדיוק את אותו הדבר. למה? אם למישהו מקוראי פתרונים, הוא מוזמן לציין זאת בתגובות.
שחר
אולי פעם (או בעתיד) אלה היו (או יהיו) באמת שני ערכים נפרדים?
תיאוריה מצויינת.
בואו נדמיין את הסיטואציה:
בא מפתח של מיקרוסופט ועושה את הערכים נפרדים.
מגיע שלב ה-QA, ואז מתגלה שעשרה אחוז מהתוכנות משתמשות בפונקציה אחת בעוד שהיו אמורות להשתמש בשניה. האם אתה באמת חושב שהערכים יישארו נפרדים? אני דווקא חושב שמנהל הפרוייקט יורה לאחד אותם חזרה.
למעשה, אתה לא יודע כמה פעמים זה כבר קרה.
שחר
כנראה שבעבר שתי הפונקציות ביצעו פעולות דומות (אבל לא זהות). באחת הגרסאות הוחלט לוותר על אחת הפונקציות (מאיזו סיבה שלא תהיה).
כדי ליצור תאימות לאחור (כך שמי שמשתמש בפונקציה שבוטלה לא יצטרך לשנות את הקוד הקיים שלו) הפונקציה שבוטלה קוראת לפונקציה הקיימת.
היי שחר
ובכן, בסביבות שנת 1993, כאשר האינטרנט היה נחלתם של אוניברסיטאות בעיקר, עולם המיחשוב התחלק למחשבים שמחוברים לאינטרנט (קרי מחשבי UNIX) ומחשבים שאינם מחוברים לאינטרנט (קרי מחשבי DOS). מחשבי UNIX באו עם חבילת התקשורת שלהם, ששמה TCP/IP, ואילו מחשבי ה-PC הגיעו עם מערכות הפעלה חסרות IP Stack כמו DOS 3.2 או Windows 3.0.
במידה ורצית להריץ אפליקציית TCP/IP על גבי מחשב ה-DOS, כמו למשל את NCSA Telnet, היית צריך להתקין Packet Driver שמימש למעשה את שכבה 2 במודל השכבות (והיה תלוי-חומרה בכרטיס הרשת הספציפי), ואז להריץ אפליקציה שמדברת TCP/IP, והאפליקציה מימשה את שכבות 3 ומעלה. כן, בקובץ הקונפיגורציה של NCSA Telnet היית מציין מה ה-NetMask.
בפרוץ Windows 3, קמו מספר יצרני תוכנה וכתבו TCP Stacks ג’נריים, שמטרתם העיקרית היתה לחבר מחשב ביתי לאינטרנט. תוכנות אלה כללו חייגן ומימוש של SLIP (קודמו של ה-PPP), וכן מימוש של קריאות ה-TCP/IP הידועות מ-UNIX. כל יצרן קרא לקריאות האלה בשם דומה לקריאה ה-UNIX-ית המקורית, אבל עם קידומת משלו, למשל חברת TRUMPET קראה לפעולת ה-Connect שלה TRMPTConnect ו
…המשך…
(סתם המצאתי את הקידומת TRMPT, אני לא באמת זוכר).
כאשר ידידנו Gates התעורר פתאום וגילה שהאינטרנט הזה הולך לשלות!!!1 חברת Microsoft כתבה ממשק משלה, וקראה לו Winsock, וקראה גם היא לכל הקריאות עם קידומת WSA שזה ראשי-תיבות של Windows Socket A-something (אולי Architecture).
באותה תקופה אכן WSAGetLastError אכן החזירה את ערך הודעת השגיאה האחרונה שקרתה בתת-מערכת ה-Winsock.
ולכן התשובה לשאלתך: מסיבות הסטוריות.
אריק
כן, אריק, כן.
אני רק רציתי להתלוצץ ולהגיד, שזה בגלל שיש להם שתי מחלקות לכל דבר, ומתוכן בוחרים את הכי טוב, וכשזה זהה, פשוט משתמשים בשתיהן, במסורת המיקורוסופטית המוכרת.
אבל אחרי מה שכתבתם פה זה כבר לא מצחיק. בעצם זה לא מצחיק גם ככה.
ניחא.