Các trường cổng SOCKS5 là hai byte không dấu theo thứ tự byte mạng: byte có trọng số lớn nhất đứng trước. Trong Go, hãy mã hóa trực tiếp một uint16 đã được xác thực:

var field [2]byte
binary.BigEndian.PutUint16(field[:], port)

Nhập encoding/binary. Với cổng 1080, các byte thập lục phân thu được là 04 38. Với cổng 4, chúng là 00 04; số không đứng đầu là một phần của trường có độ rộng cố định.

Nếu đầu vào bắt đầu như một số nguyên lớn hơn hoặc một chuỗi, hãy xác thực phạm vi số của nó trước khi chuyển đổi sang uint16. Việc chuyển đổi có thể loại bỏ các bit cao thay vì báo cáo giá trị ngoài phạm vi.

Trong một phản hồi SOCKS5, hãy tuần tự hóa BND.PORT, tức trường cổng đã liên kết của máy chủ. Đừng sao chép cổng đích được yêu cầu vào trường đó chỉ vì cả hai đều chiếm hai byte. Đặt trường đã mã hóa sau địa chỉ của phản hồi, mà độ dài phụ thuộc vào ATYP.

Bài viết liên quan