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.
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? –
seg.server.fault, vâng. –
@ 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