SOCKS5 ענטפֿער אין .NET 7+: באַהאַנדלען טייל TCP לייענען
לייענט דעם פֿעסטן פּרעפֿיקס פֿונעם SOCKS5 באַפֿעל־ענטפֿער און דעם ATYP־אָפּהענגיקן סופֿיקס אָן זיך פֿאַרלאָזן אויף די TCP שרײַב גרענעצן פֿונעם סערווער.
אַ SOCKS5 סערווער שרײַבט פֿיר בייטן באַזונדער, און דער קליענט אַרבעט ערשט נאָך דעם וואָס די שרײַבונגען ווערן צונויפֿגעשטעלט. צונויפֿשטעלן קען ענדערן די צײַטן, אָבער TCP פֿאַרשפּרייכט נאָך אַלץ נישט איין לייענען פֿאַר יעדער שרײַבונג.
דער קליענט דאַרף אַן ענטפֿער־פּאַרסער. נאָך דער אויסקלײַב פֿון מעטאָד און יעדער נייטיקער אויטענטיפֿיקאַציע, הייבט זיך אַ SOCKS5 באַפֿעל־ענטפֿער אָן מיט פֿיר בייטן: ווערסיע, רעזולטאַט, רעזערווירטער בייט און אַדרעס־טיפּ. די איבעריקע לענג הענגט אָפּ פֿון דעם אַדרעס־טיפּ.
אַ .NET 7+ פּאַרסער וואָס דאַרף נאָר פֿאַרנוצן אַ געראָטן CONNECT ענטפֿער קען ניצן:
static async Task ReadConnectReply(Stream stream, CancellationToken ct)
{
byte[] prefix = new byte[4];
await stream.ReadExactlyAsync(prefix, ct);
if (prefix[0] != 5 || prefix[2] != 0)
throw new IOException("Invalid SOCKS5 reply");
if (prefix[1] != 0)
throw new IOException($"SOCKS5 request failed: {prefix[1]}");
int remaining;
switch (prefix[3])
{
case 1: remaining = 4 + 2; break;
case 4: remaining = 16 + 2; break;
case 3:
byte[] length = new byte[1];
await stream.ReadExactlyAsync(length, ct);
remaining = length[0] + 2;
break;
default:
throw new IOException("Unknown SOCKS5 address type");
}
await stream.ReadExactlyAsync(new byte[remaining], ct);
}
די לעצטע צוויי בייטן זענען דער געבונדענער פּאָרט. IPv4 דאַרף פֿיר בייטן; IPv6 דאַרף זעכצן; אַ דאָמען־אַדרעס טראָגט אַ לענג־בייט פֿאַר דעם נאָמען.
גיט אַן אָפּזאָג־טאָקען מיט דער באַשטימטער פֿאַרהאַנדלונג־צײַט. ReadExactlyAsync באַהאַנדלט קירצערע איינציקע לייענען און וואַרפֿט אַן אויסנאַם ווען דער שטראָם ענדיקט זיך פֿאַר דער געפֿאָדערטער לענג. בײַם דורכפֿאַל, וואַרפֿט אָפּ דעם דורכגעפֿאַלענעם פֿאַרבינדונג דורך דעם רייניקונג־וועג פֿון זײַן באַזיצער.
בײַם דערפֿאָלג, שטעלט זיך אָפּ בײַ דער ענטפֿער־גרענעץ. די בייטן דערנאָך געהערן צום ציל־פּראָטאָקאָל. אַ גרעסערער פֿאָרויסזאָג לייענען מוז אויפֿהיטן די איבעריקע בייטן אַנשטאָט אָפּוואַרפֿן דעם אָנהייב פֿונעם אַפּליקאַציע־שטראָם.