2011-12-26 26 views
9

Vâng, câu hỏi của tôi có thể trông giống như một công cụ cơ bản, nhưng tôi mới đến bên lập trình mạng. Tôi muốn biết:Có phải luôn luôn cần phải ràng buộc một ổ cắm?

1) Luôn luôn phải ràng buộc một ổ cắm để nhận tin nhắn từ đó? Tôi thấy một mã sniffer (nguyên ổ cắm) một trong đó trực tiếp nó được gọi recvfrom và một đoạn mã mà nó được gọi bind và sau đó nhận được.

2) Sự khác nhau giữa họ AF_ * và PF_ * là gì? Sau này có liên quan đến POSIX không? Đề xuất nào được khuyến nghị?

+0

1) Không, ràng buộc để nhận UDP là tùy chọn. –

+0

http://stackoverflow.com/questions/2549461/what-is-the-difference-between-af-inet-and-pf-inet-constants. IIRC, P là viết tắt của giao thức (family) trong khi A là viết tắt của Address. – Aif

+0

@Kerrek SB: Nhưng mã sniffer tôi đang tham chiếu bắt các gói từ các giao thức khác quá nhưng vẫn không được gọi 'bind' – kingsmasher1

Trả lời

8

Không, bạn không cần phải ràng buộc().

Nếu bạn đang sử dụng ổ cắm TCP hoặc UDP nơi bạn định kết nối() hoặc gửi gói đến đích bằng sendto(), hạt nhân sẽ tự động kết nối ổ cắm với số cổng phù hợp khi bạn thử để kết nối hoặc gửi. Đây thường là cách ưu tiên. bind() ing socket của khách hàng được coi là có hại.

Điều tương tự cũng đúng với các ổ cắm AF_UNIX - phía máy khách không cần phải ràng buộc và không nên làm như vậy bình thường.

+0

Vì vậy, bạn không đồng ý với KerrekSB, nơi ông nói nó chỉ để nhận các gói tin. Đúng? Ngay cả kết nối là không cần thiết như bạn có thể nhìn thấy từ các liên kết ở trên. Chỉ cần một cuộc gọi đến 'socket', tiếp theo là' recvfrom' – kingsmasher1

+0

Tôi đang nói về ổ cắm TCP hoặc UDP. Điều gì xảy ra trong ổ cắm thô thực sự không liên quan. – MarkR

+0

Bạn có thể giải thích tại sao các ổ cắm của máy khách bị coi là có hại không? – Pacerier

0

Tôi không biết về Linux, nhưng trên Windows, nếu recvfrom() được gọi trên ổ cắm không liên kết, nó sẽ không thành công với lỗi WSAEINVAL.

+0

Tôi không nghĩ rằng nó rất hữu ích để cố gắng để nhận các gói tin trên một ổ cắm UDP mà không bị ràng buộc vào một cổng cụ thể, trừ khi bạn đã gửi một số đã. Có thể kết nối một socket với một cổng "không quan tâm", sau đó tìm cổng với getockname. Ví dụ, nếu tôi muốn sử dụng UDP để nhận các gói từ một máy chủ, nhưng sử dụng TCP để gửi các lệnh (cùng một lúc) - ví dụ, trong một số tình huống phát trực tuyến mà tôi chỉ nhận được trong UDP, không bao giờ gửi.Tôi sẽ phải liên kết với cổng 0 (không quan tâm) và sau đó vượt qua số cổng trên giao thức của tôi (TCP) đến máy chủ. – MarkR

Các vấn đề liên quan