2017-03-16 144 views
0

我試圖使用ACE實現一個基本的客戶端服務器程序,但問題是如果我從客戶端發送並從服務器接收它,它工作正常。但是,當我增加複雜性時,即多次發送和恢復程序無法正常工作。任何幫助表示讚賞。ACE C++ send_n和recv_n不按預期工作

這裏是客戶端代碼。

#include "ace/SOCK_Acceptor.h" 
#include "ace/SOCK_Connector.h" 
#include "ace/SOCK_Stream.h" 
#include "iostream" 
using namespace std; 
int main(){ 
    ACE_INET_Addr server(7128); 
    ACE_SOCK_Connector cli; 
    ACE_SOCK_Stream cstream; 
    if(cli.connect(cstream, server)==-1){perror("Error");} 
    char buff[100]; 
    if(-1==cstream.recv_n(buff, 7)){printf("Error");} 
    cout<<buff<<endl; 
    cstream.send_n("FU", 3); 
    } 

這裏的服務器代碼

#include "ace/SOCK_Acceptor.h" 
#include "ace/SOCK_Connector.h" 
#include "ace/SOCK_Stream.h" 
#include "iostream" 
using namespace std; 
int main(){ 
    ACE_INET_Addr server(7128); 
    ACE_INET_Addr client; 
    ACE_SOCK_Acceptor cli(server); 
    ACE_SOCK_Stream cstream; 
    if(cli.accept(cstream, &client)==-1){perror("Error");} 
    char buff[100]; 
    if(-1==cstream.send_n("RAND", 5)){printf("Error");} 
    cstream.recv_n(buff, 3); 
    } 

回答

0

你的服務器發送5個字節,但您的客戶端需要讀取7.客戶被阻塞等了2個,這將永遠不會到來更多的字節。

+0

如何通過套接字發送整數值?不像一個字符數組。我想發送它而不知道預定義的長度。 – KingC

+0

通過套接字發送一個整數長度值會打開另一罐蠕蟲。現在,試着將服務器的send_n參數改爲(「RANDY!」,7)。有關長度等問題,請參閱我的/ Doug Schmidt的書「C++網絡編程第1卷」第4章。 –