2009-09-18 71 views
8

我正在寫簡單的客戶端服務器程序。如何區分客戶端是否使用TCP或UDP從服務器端

客戶端使用UDP或TCP向服務器發送一些消息。服務器必須能夠支持UDP和TCP。

如果客戶端使用UDP發送消息,客戶端的方法調用順序爲socket(),bind(),sendto(),recvfrom(),close(),服務器中的方法調用順序爲socket(),bind(),sendto(),recvfrom(),close()

如果它使用TCP, 服務器中的呼叫順序是 socket(),bind(),listen(),accept(),send(),recv(),close()。 和在客戶端是 socket(),bind(),connect(),send(),recv(),close()

在我的程序中,用戶/客戶端在開始時給出了選擇他想要使用UDP或TCP的選擇。所以,我的主要問題是如何在服務器端知道或區分,如果客戶端使用TCP或UDP發送消息。如果它使用TCP,我必須調用listen(),accept(),send(),recv() ,如果它使用UDP,我不會調用listen(),accept(),而是調用sendto()和recvfrom )。

那麼,我怎麼才能區分/瞭解這一開始,以便我可以做出適當的函數調用。

謝謝。

+1

那麼,我應該在服務器端創建兩個套接字,一個用於UDP,另一個用於TCP? – 2009-09-18 14:52:41

+0

seg.server.fault,是的。 – 2009-09-18 15:15:58

+2

@ seg.server.fault:我會推薦_not_在您的客戶端代碼中調用'bind()'。雖然它在技術上是可行的(並且在非常特定的情況下是必需的),但沒有客戶端'bind()'的默認行爲通常是您在應用程序層需要的。 另外,請記住,你可以在UDP套接字上調用'connect()'。它沒有進行任何握手,但是這意味着你可以使用'send/recv'而不是'sendto/recvfrom',這可能最終導致客戶端邏輯變得更簡單。 – Tom 2009-10-24 05:47:59

回答

15

做UDP連接的數據包到達你之前,你不知道它是否是UDPTCP做。

因此,如果您希望同時請求這兩種方式,您希望綁定到UDPTCP套接字。

一旦你做了,你就知道它通過你接收數據包的套接字來的方式。

1

只是讓口X TCP套接字監聽,並通過出口Y

+6

您可以安全地在同一個端口上監聽UDP和TCP。 – 2009-09-18 14:48:08

5

當您創建套接字,你傳遞一個類型 - SOCK_STREAM(TCP)或SOCK_DGRAM(UDP)

所以兩種流量將在兩個不同的插座。

+0

這對服務器端沒有幫助。 OP已經知道客戶端將決定TCP與UDP。問題是在服務器端支持它們,這比單純更改套接字類型要花費更多的精力。 – Tom 2009-10-24 05:45:08