// Copyright (C) 2004 Jean-Marc Valin #include #include #include #include #include #include #include #include #include #include "BufferedNode.h" #include "stream_wrap.h" #include "Stream.h" #include using namespace std; namespace FD { class TCPConnect; DECLARE_NODE(TCPConnect) /*Node * * @name TCPConnect * @category IO * @description Creates a read-only stream from a filename * * @output_name OUTPUT * @output_description Commected socket in RW mode * @output_type Stream * * @parameter_name HOST * @parameter_type string * @parameter_description Hostname * * @parameter_name PORT * @parameter_type int * @parameter_description Port number * * @parameter_name BLOCKING * @parameter_type bool * @parameter_value true * @parameter_description Whether to make the socket blocking * END*/ class TCPConnect : public BufferedNode { int outputID; string host; int port; bool blocking; public: TCPConnect(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { outputID = addOutput("OUTPUT"); host = object_cast (parameters.get("HOST")); port = dereference_cast (parameters.get("PORT")); if (parameters.exist("BLOCKING")) blocking = dereference_cast (parameters.get("BLOCKING")); else blocking = true; } void calculate(int output_id, int count, Buffer &out) { struct sockaddr_in addr; int fd = socket(PF_INET, SOCK_STREAM, 0); //int port = 2313; struct hostent *entp; memset(&addr, 0, sizeof(struct sockaddr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); if (bind (fd, (struct sockaddr *)&addr, sizeof(addr))) throw new NodeException(this, string("bind failed: ") + string(strerror(errno)), __FILE__, __LINE__); if((entp = gethostbyname(host.c_str())) == NULL) throw new NodeException(this, string("Can't get host by name: ") + host, __FILE__, __LINE__); memcpy(&addr.sin_addr, entp->h_addr_list[0], entp->h_length); addr.sin_port = htons(port); if (connect (fd, (struct sockaddr *)&addr, sizeof(addr))) throw new NodeException(this, string("connect failed: ") + string(strerror(errno)), __FILE__, __LINE__); if (!blocking) fcntl(fd, F_SETFL, O_NONBLOCK); out[count] = ObjectRef (new IOStream (new fd_iostream(fd))); } NO_ORDER_NODE_SPEEDUP(TCPConnect) }; }//namespace FD