2011-05-05 83 views
1

我有一個服務器和一個客戶端應用程序,我的服務器偵聽端口10015和一個客戶端發送命令到該端口。目前兩者都運行在同一臺機器上,但將來的目標將是在不同的機器上運行。我現在有這部分工作。服務器和客戶端是否可以在同一個端口上啓動通信併發送命令?

接下來我需要做的是讓我的服務器向我的客戶端發送命令。所以我想我可以重新使用我的客戶端服務器中的代碼來監聽端口。

但我不確定這是做到這一點的最佳方法。建議?

當我第一次嘗試這個時,我首先運行了我的客戶端應用程序,並將命令發送給自己。我的服務器應用程序未能綁定到端口(我假設您只能有一個進程在偵聽給定端口?)

問題1) 服務器如何向客戶端發送命令?我必須創建使端口10015上的服務器 - >客戶端通信和客戶端---> 10016上的其他端口上的服務器通信嗎?

問題2) 當我使用send()從客戶端 - >服務器發送命令時,接收特定命令的ACK的最佳方式是什麼?如果我不需要發回任何數據,有沒有辦法在服務器收到數據包時自動獲得ACK?

我目前做這行我要發送的每一個命令:

create socket() 
conenct() to socket 
send() packet 
then call recv() to receive any data 
then shutdown() connection 
and closesocket() at end 

無法確定是否有更好的方法來做到這一點?當我的應用程序忙時,我希望每秒發送1-10個命令。

謝謝,我是新來的這個網絡應用程序,所以任何幫助,非常感謝。

在閱讀完一些評論後編輯
我正在使用TCP協議。當我說ACK時,我的意思是我只是想從其他應用程序得到一些確認,說明命令已被接收和處理,沒有錯誤

+1

是的,只有一個進程可以同時綁定和偵聽TCP地址+端口。那麼你有兩個想要交換數據的程序?除非我錯過了任何東西,否則您可以使用一個套接字並雙向發送數據。 – IanNorton 2011-05-05 19:06:13

+0

你能說出你有什麼協議嗎?如果這確實是TCP,那麼你不需要發送和接收ACK消息。 – IanNorton 2011-05-05 19:09:32

+0

如果打開TCP/IP網絡套接字,則不需要關閉連接,請將其保持打開狀態。服務器和客戶端可以互相發送消息。你提到ACK,你會寫一個HL7接口嗎? – 2011-05-05 19:09:36

回答

6

通常的方法如下:

  1. 「服務器」套接字綁定到指定的端口 - 這看起來會是10015爲您服務。
  2. 「客戶機」用於其傳出傳輸的ephemeral port
  3. 如果服務器向客戶端作出響應,它發送一個消息從它綁定端口(10015)到消息#2的源端口,臨時端口。

在服務器上:

如果使用的是UDP,你可以簡單的拷貝一個recvfrom的()爲您傳遞到的sendto()的sockaddr結構體中設置的sockaddr結構體。

如果您使用TCP,accept()返回的套接字文件描述符可用於send()以將響應流量發送到客戶端。

我最喜歡的C Sockets參考是免費的,可在線使用Beej's Guide to Network Programming

0

您的問題意味着您正在使用UDP。這要求客戶端在端口上進行監聽(與TCP中的套接字上的雙向通信)。

你是對的,他們都不能使用相同的端口。您需要讓客戶端在一個端口上進行偵聽,如果服務器嘗試綁定到單臺計算機上的同一個接口,則需要另一臺服務器。

問題2的答案是......你使用UDP。你必須明確地發回一些東西。您應該在服務器中使用recvfrom();爲向何處發送ACK信息被存儲在你通過struct sockaddr *src_addr重新閱讀後

編輯:如果你還沒有嘗試使用UDP ......你只是與客戶端連接到服務器並在套接字之間來回通信。你的客戶不聽任何東西。教程here應該有所幫助。

這樣做
0

只要他們在不同的主機上,他們可以在同一端口監聽。

0

你是對的,兩個應用程序不能同時在同一個端口上偵聽,在同一個地址。如果你希望你的客戶端擁有自己的監聽套接字,那麼它應該使用不同的端口號 - 你對服務器的建議是10015,客戶端的10016是好的。

但是 - 您可能會做而不是需要客戶端擁有自己的偵聽套接字。 TCP連接是全雙工的 - 只要該連接仍處於打開狀態,服務器就可以簡單地向客戶端發送請求,並返回到客戶端用於向服務器發送請求的同一連接。

至於問題2,接收有用ACK的最好和唯一的方法是讓你的應用程序自己發送它 - 通常在執行命令後發送它。

至於你當前的發送命令的方法,你爲每個命令設置和拆除一個新的連接,這是非常低效的(並且也阻止你使用相同的連接作爲從服務器到後端通道的連接客戶端)。相反,您應該保持連接打開並使用它來發送多個命令。


1.實際上,這不是真的 - 它們可以,但是每個傳入的連接只能被其中一個接受。這不是你想要的。

+0

',也可以防止......'不,不。 – EJP 2011-05-06 12:38:39

+0

@EJP:當然可以 - 如果客戶端在收到對其命令的響應後立即關閉套接字,那麼稍後服務器要發送命令時不會打開套接字。 – caf 2011-05-06 12:44:22