2009-09-18 42 views
8

Tôi đang viết chương trình máy khách-máy khách đơn giản.cách phân biệt nếu máy khách đang sử dụng TCP hoặc UDP từ phía máy chủ

Khách hàng gửi một số thư đến máy chủ bằng UDP hoặc TCP. Máy chủ phải có khả năng hỗ trợ cả UDP và TCP.

Nếu khách hàng, gửi tin nhắn bằng UDP, chuỗi các cuộc gọi phương thức trong ứng dụng khách là socket(),bind(),sendto(),recvfrom(),close() và trong máy chủ là socket(),bind(),sendto(),recvfrom(),close().

Nếu sử dụng TCP, chuỗi cuộc gọi trong máy chủ là socket(),bind(),listen(),accept(),send(),recv(),close(). và trong ứng dụng khách là socket(),bind(),connect(),send(),recv(),close()

Trong chương trình, người dùng/khách hàng được lựa chọn khi bắt đầu chọn những gì mình muốn sử dụng UDP hoặc TCP. Vì vậy, vấn đề chính của tôi là làm thế nào tôi có thể biết hoặc phân biệt ở phía máy chủ, nếu khách hàng đang gửi tin nhắn bằng cách sử dụng TCP hoặc UDP. Nếu nó sử dụng TCP, tôi phải gọi listen(), accept(), send(), recv() và nếu nó sử dụng UDP, tôi không gọi listen(), accept() nhưng gọi sendto() và recvfrom ().

Vì vậy, làm thế nào tôi có thể phân biệt/biết điều này ngay từ đầu để tôi có thể thực hiện các cuộc gọi chức năng thích hợp.

Cảm ơn.

+1

Vì vậy, tôi có nên tạo hai ổ cắm ở phía máy chủ, một cho UDP và một cho TCP? –

+0

seg.server.fault, vâng. –

+2

@ seg.server.fault: Tôi khuyên bạn nên _not_ gọi 'bind()' trong mã máy khách của bạn. Mặc dù về mặt kỹ thuật có thể (và được yêu cầu trong các tình huống rất cụ thể), nhưng hành vi mặc định không có một 'bind() phía máy khách 'thường là những gì bạn muốn ở lớp ứng dụng. Ngoài ra, hãy nhớ rằng bạn _can_ gọi 'connect()' trên ổ cắm UDP. Nó không thực hiện bất kỳ việc bắt tay nào, nhưng nó có nghĩa là bạn có thể sử dụng 'send/recv' thay vì' sendto/recvfrom', điều này có thể làm cho logic của máy khách trở nên đơn giản hơn. – Tom

Trả lời

15

Trước khi gói tin đến bạn, bạn không biết cho dù đó là UDP hoặc TCP.

Vì vậy, bạn muốn liên kết với cả hai ổ cắm UDPTCP nếu bạn mong đợi cả hai cách.

Một khi bạn đã làm, bạn chỉ biết cách nó đến bằng các ổ cắm bạn nhận được gói thông qua.

1

chỉ để cho các socket TCP lắng nghe trên cổng X, và thực hiện các kết nối UDP thông qua cổng Y

+6

bạn có thể nghe an toàn trên UDP và TCP trên cùng một cổng. –

5

Khi bạn tạo các ổ cắm, bạn vượt qua một loại - SOCK_STREAM (TCP) hoặc SOCK_DGRAM (UDP)

Vì vậy, hai loại giao thông sẽ được trên hai ổ cắm khác nhau.

+0

Điều đó không giúp ích cho phía máy chủ. OP đã biết rằng phía máy khách sẽ quyết định TCP so với UDP. Vấn đề là hỗ trợ cả hai ở phía máy chủ, và đó là nỗ lực đáng kể hơn chỉ đơn giản là thay đổi loại socket. – Tom

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