[ace-users] ACE_SOCK_Stream not sending data
From
yanhangxiong@gmail.com@21:1/5 to
All on Sat Nov 28 10:32:49 2015
Hi, everyone,
I'm using ACE to implement a simple application using acceptor-connector and reactor framework. I got some problems with the connection.
In short, the client can normally send the data, but the server won't call svc_handler's handle_input() method. The only time this method is triggered is when closing the stream. However, the acceptor's handle_input() method can be properly triggered.
Another observation is that when I manually increate the buffer size to send (10*BUFSIZ), server's handle_input() can be triggered, but the data is pretty random.
Also, everything works perfectly when I run the client and server on a single machine (communicated by 127.0.0.1). The problem above occurs when I run the client and server on separate machines.
I'm programming on OS X El Captian and Ubuntu 15.04, using clang.
The following is some code segments:
Client:
ACE_SOCK_Stream stream;
ACE_SOCK_Connector connector;
if(connector.connect(stream, remote_addr) < 0){
cerr << "Can not connect to Producer!" << endl;
return returnType::ECONNECTION;
}
for(int i=0; i<10; i++) {
if (sendPlayList(director, stream, local_port) < 0) {
cerr << "Can not connect to Producer" << endl;
return returnType::ECONNECTION;
}
}
stream.send() is called inside sendPlayList()
Server:
class ProducerInputHandler : public ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> {
public:
inline void setPlayList(const std::shared_ptr<PlayList> playlist_,
const std::shared_ptr<unique_set> unique_addr_) {
playlist = playlist_;
unique_addr = unique_addr_;
}
int parseCommand(const std::string& str);
virtual int handle_input(ACE_HANDLE=ACE_INVALID_HANDLE);
virtual int handle_close(ACE_HANDLE, ACE_Reactor_Mask);
private:
std::shared_ptr<PlayList> playlist;
std::shared_ptr<unique_set> unique_addr;
};
class ProducerAcceptor: public ACE_Acceptor<ProducerInputHandler, ACE_SOCK_Acceptor>{
public:
ProducerAcceptor(const std::shared_ptr<PlayList> playlist_,
const std::shared_ptr<unique_set> unique_addr_):
playlist(playlist_) , unique_addr(unique_addr_){}
virtual int make_svc_handler(ProducerInputHandler *&sh){
printf("Connection received\n");
ProducerInputHandler *h;
ACE_NEW_RETURN(h, ProducerInputHandler(), -1);
sh = h;
sh->setPlayList(playlist, unique_addr);
sh->reactor(reactor());
return 0;
}
private:
const std::shared_ptr<PlayList> playlist;
const std::shared_ptr<unique_set> unique_addr;
};
int ProducerInputHandler::handle_input(ACE_HANDLE h){
char data[BUFSIZ] = {};
ACE_SOCK_Stream& stream = peer();
string str;
ssize_t res = stream.recv(data,sizeof(data));
cout << "size: " << res << endl;
if(res <= 0)
return -1;
str.append(data);
return parseCommand(str);
}
So am I doing something wrong?
Thanks!
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)