קבלת ה"URL המלא" בחיבור TCP בGO
-
-
אני רוצה להתחבר לשרת TCP עם בקשה כזאת
tcp:127.0.0.1:8080/play?file=1
ושאוכל לפרק את הפרמטרים בשרת למשתנים.ראיתי אופציה כזאת כאן
אבל לא הצלחתי להבין מה קורה שם?
והאם זה אפשרי בכלל או שזה משתנה מיוחד שנשלח ע"י אסטריסק, ואי אפשר לשלוח כזה פרמטר מעל TCP?@nigun אמר בקבלת ה"URL המלא" בחיבור TCP בGO:
אני רוצה להתחבר לשרת TCP עם בקשה כזאת
tcp:127.0.0.1:8080/play?file=1זה לא קיים ב-TCP. פרוטוקול TCP פותח ערוץ פשוט, אין פרמטרים.
נראה לי שבפרוטוקול fastAGI הפרמטרים נשלחים בתחילת ההתקשרות דרך ערוץ ה-TCP. -
@nigun אמר בקבלת ה"URL המלא" בחיבור TCP בGO:
אני רוצה להתחבר לשרת TCP עם בקשה כזאת
tcp:127.0.0.1:8080/play?file=1זה לא קיים ב-TCP. פרוטוקול TCP פותח ערוץ פשוט, אין פרמטרים.
נראה לי שבפרוטוקול fastAGI הפרמטרים נשלחים בתחילת ההתקשרות דרך ערוץ ה-TCP. -
@nigun אני לא מבין בדיוק את השאלה שלך.
TCP זה פרוטוקול בינארי להקמת ערוץ התקשרות בין שתי מכונות מרוחקות. אחרי הקמת הערוץ אפשר לשלוח דרכו מה שאתה רוצה.
HTTP זה פרוטוקול (פרוטוקול = שפה מוסכמת) טקסטואלי שמגדיר דרך לבקש/לעדכן/ליצור/למחוק וכו' משאבים משרת אינטרנט דרך ערוץ TCP. תקשורת HTTP משתמשת ב-TCP מתחתיו להקמת הערוץ והוא מעביר את ההתקשרות על גבי ערוץ ה-TCP.
כמו"כ AGI. זה פרוטוקול טקסטואלי שמדבר מעל גבי פרוטוקול TCP.פרמטרים ב-HTTP נשלחים בשורה הראשונה של הבקשה, דוגמה:
GET /some-page?some_parameter=some_value HTTP/1.1
פרמטרים ב-AGI נשלחים מיד בפתיחת הערוץ בפרומט זה:
agi_xxxx: yyyyyy agi_zzz: qqqqq
-
@nigun אני לא מבין בדיוק את השאלה שלך.
TCP זה פרוטוקול בינארי להקמת ערוץ התקשרות בין שתי מכונות מרוחקות. אחרי הקמת הערוץ אפשר לשלוח דרכו מה שאתה רוצה.
HTTP זה פרוטוקול (פרוטוקול = שפה מוסכמת) טקסטואלי שמגדיר דרך לבקש/לעדכן/ליצור/למחוק וכו' משאבים משרת אינטרנט דרך ערוץ TCP. תקשורת HTTP משתמשת ב-TCP מתחתיו להקמת הערוץ והוא מעביר את ההתקשרות על גבי ערוץ ה-TCP.
כמו"כ AGI. זה פרוטוקול טקסטואלי שמדבר מעל גבי פרוטוקול TCP.פרמטרים ב-HTTP נשלחים בשורה הראשונה של הבקשה, דוגמה:
GET /some-page?some_parameter=some_value HTTP/1.1
פרמטרים ב-AGI נשלחים מיד בפתיחת הערוץ בפרומט זה:
agi_xxxx: yyyyyy agi_zzz: qqqqq
-
@yossiz
סליחה שלא הסברתי
השאלה שלי היית בגלל שיש פונקציה לקבלת הכתובת+פורט של הקליינט או השרת, גם בלי שזה נשלח כפרמטר.
אז תהיתי האם שייך (באופן תיאורטי) לקבל גם את שאר הבקשה? -
@yossiz
לפני זה הבנתי אותי מצויין
אני יסביר טיפה יותר
בקוד הזה ניתן לקבל את הכתובת IP + פורט של הלקוח (הקוד לא מדיוק, זה רק לרעיון)l, err := net.Listen("tcp", PORT) conn, err := l.Accept() log.Print(conn.RemoteAddr().String())
אבל אי אפשר לקבל את שאר הבקשה.
כנראה שבפרוטוקול TCP נשלח רק הכתובת + הפורט ואולי הTimeout
(ככה נראה מכאן) -
@yossiz
לפני זה הבנתי אותי מצויין
אני יסביר טיפה יותר
בקוד הזה ניתן לקבל את הכתובת IP + פורט של הלקוח (הקוד לא מדיוק, זה רק לרעיון)l, err := net.Listen("tcp", PORT) conn, err := l.Accept() log.Print(conn.RemoteAddr().String())
אבל אי אפשר לקבל את שאר הבקשה.
כנראה שבפרוטוקול TCP נשלח רק הכתובת + הפורט ואולי הTimeout
(ככה נראה מכאן)@nigun הפורט וה-IP הם פרטים של הערוץ ונשלחים כחלק מפרוטוקול TCP (או יותר נכון ה-IP נשלח כחלק מפרוטוקול IP שזה שכבה נמוכה יותר מ-TCP, והפורט הוא חלק מפרוטוקול TCP).
"שאר הבקשה" זה המידע שנשלח על גבי ערוץ ה-TCP (לא כחלק מפרוטוקול TCP).
להסביר יותר, בכל פקטת TCP יש את המעטפת שזה כל הפרטים שקשורים לניהול הערוץ שהם חלק מפרוטוקול TCP ויש את השדה של ה-payload, שזה המידע שאתה שולח על גבי הערוץ.
תפתח הקלטת wireshark ותראה את זה.אפשר לקבל את הבקשה על ידי קריאת
read
על ה-conn