2013-03-07 124 views
0

我想寫一個簡單的服務器客戶端應用程序,它應該這樣做: 客戶端連接到服務器,服務器等待消息,客戶端從用戶接受輸入,並將其發送到服務器。服務器收到此消息並將其發送回客戶端,客戶端打印消息並循環並重新開始。然而,由於某種原因,我有一個相當奇怪的問題:當我發送第一條消息時,服務器會迴應它,當我發送第二條消息時,服務器會再次響應第一條消息。當我發送我的第三條消息時,服務器以第二條消息的響應等等。簡單的C++服務器客戶端應用程序與winsock

這裏是我的服務器代碼來處理連接:

class themusers { 
    char ReMessage[200],SeMessage[200]; 

public: 
    void * HandleConnections(SOCKET connector,int location) { 

    std::string Converter; 

     for (;;) { 

     if (recv(connector,ReMessage,sizeof(ReMessage),NULL) == -1) 
      std::cout << "Disconnected." << std::endl; 
      discon.lock(); 
      sock_connection[location] = NULL; 
      discon.unlock(); 
      break; 
     } 


     else { 
        //this is the code that handles the receive/send operation 
      msgmut.lock(); 
      //std:: cout << ReMessage << std::endl; 
      memcpy(SeMessage, ReMessage, sizeof(ReMessage)); 
      send(connector, SeMessage, sizeof(SeMessage), NULL); 
      msgmut.unlock();   
     } 

     } 


     return NULL; 
     } 
}; 

這是我的客戶端代碼:拇指與[TCP] socket編程

for (;;) { 
    cin >> tell; 
    send(sock, tell, sizeof(tell), NULL); 
    recv(sock,Message,sizeof(Message),NULL); 
    Converter = Message; 
    cout << "Server: " << Converter << endl; 
} 
+0

也許與'cin'而不是套接字有關的問題?它不是用緩衝輸入做奇怪的事情嗎? – 2013-03-07 19:54:15

+1

你是不是在服務器代碼中的'if'之後錯過了一個捲曲? – 2013-03-07 19:58:41

+0

不,只是檢查。似乎沒有。 – 2013-03-07 20:00:38

回答

1

規則 - 算你的字節。這意味着實際上要注意從send(2)recv(2)返回的值。他們告訴你多少緩衝區分別從網絡發出和填充。

這種情況與UDP有點不同,但這可能並不重要。

+0

特別是,200字節的「發送」可以在另一端以幾個較小的塊被接收。 – Roddy 2013-03-07 20:29:54

0

Boost ASIO是一個非常好的C++庫,用於實現同步和異步操作的網絡和套接字I/O用法。

你可以在這裏找到:

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio.html

他們也有這說明實現自己的音樂庫的聊天服務器的例子,其它用途:

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html

如果你有興趣學習如何構建異步操作,你應該研究一下proactor設計模式。

+1

都是真的,但這個簡單案例的矯枉過正 – 2013-03-07 20:24:21

0

我同意尼古拉。記錄返回的字節數很重要。另外,在從recv()返回值時,將default else子句更改爲條件。

您的編譯器是否將NULL定義爲零?將recv函數中的參數更改爲零也可能更安全。

您可能還會考慮在複製到發送緩衝區後修改/清零您的接收緩衝區。 (爲了追溯目的)

+0

噢,好吧。我會研究它。謝謝 – 2013-03-07 21:25:48