Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 55494225df0b8698de1a4d424d8d98b3 > files > 71

UpTools-devel-8.6.3-2.fc18.i686.rpm

/* UpTools v8.6
 *
 * Copyright (c) 2005-2013 Fundacion Universidad de Palermo (Argentina).
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * 4. Redistributions of any form whatsoever must retain the following
 *    acknowledgment: 'This product includes software developed by the
 *    "Universidad de Palermo, Argentina" (http://www.palermo.edu/).'
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <UpTools/UpInet.h>
#include <UpTools/UpSelect.h>
#include <UpTools/UpSmartLinkPtr.h>
#include <iostream>

#include <cerrno>


class UpSocketLinkable : public UpSocket, public UpLinkable {
	public: UpSocketLinkable() : UpLinkable("UpSocketLinkable") {}
};
typedef UpSmartLinkPtr<UpSocketLinkable> UpSocketPtr;

int main() {

	std::cout	<< "--UpSelect test--------------------------------------\n";

	UpSocketPtr s1(new UpSocketLinkable) ,s2(new UpSocketLinkable);

	if( ! s1->bind("127.0.0.1", 2000) ) {
		std::cerr << "error binding to " << s1->getLocalSockAddr() << std::endl;
		return 1;
	}
	if( ! s1->listen(10) ) {
		std::cerr << "error seting the listen queue to socket" << std::endl;
		return 1;
	}
	if( ! s2->bind("/tmp/unixsock") ) {
		std::cerr << "error binding to " << s2->getLocalSockAddr() << std::endl;
		return 1;
	}
	if( ! s2->listen(10) ) {
		std::cerr << "error seting the listen queue to socket" << std::endl;
		return 1;
	}


	std::cout<<"accepting connections at "<<s1->getLocalSockAddr()<<std::endl;
	std::cout<<"accepting connections at " << s2->getLocalSockAddr()<<std::endl;

	UpSelect<UpSocketPtr> sel;
	UpSocketPtr sp;
	char line[10240];
	int n;

	sel.set(s1->fd(),s1,true,false,false);
	sel.set(s2->fd(),s2,true,false,false);
	sel.setTimeOut((time_t)10);

	while( (n=sel.check()) >=0 ) {
		if( n==0 ) {
			std::cout<<"timeout, finishing."<<std::endl;
			break;
		}
		sp = sel.nextExceptionPtr();
		if( sp ) {
			std::cout<<" exception (out of band data) at sd:"<<sp->fd()<<std::endl;
			return 1;
		}
		while( (sp=sel.nextReadPtr()) ) {
			if( sp==s1 || sp==s2 ) {
				UpSocketPtr snew = new UpSocketLinkable;
				if( !sp->accept(*snew) ) {
					std::cerr<<"error accepting connections at "
						<<sp->getLocalSockAddr()<<std::endl;
					return 1;
				} else {
					std::cout<<"connection accepted from "
						<<snew->getRemoteSockAddr()<<std::endl;
					sel.set(snew->fd(),snew,true,false,false);
				}
				continue;
			}
			n = sp->read(line,10240);
			if(n < 0 ) {
				strcpy(line,strerror(errno));
				std::cerr <<"sd "<< sp->fd() <<" read error: "<< line << std::endl;
				// socket will be automatically deleted by
				// the smart pointer when no one is linking it
				sel.remove(sp->fd());
				if( ! sel.readCount() ) return 1;
				continue;
			}
			if( n==0 ) {
				std::cout << "sd " <<  sp->fd() << " end of file" << std::endl;
				// socket will be automatically deleted by
				// the smart pointer when no one is linking it
				sel.remove(sp->fd());
				if( ! sel.readCount() ) return 1;
				continue;
			}
			std::cout << "read from sd " << sp->fd() << ":\n";
			std::cout.write(line,n);
			std::cout << std::endl;
		}
	}

	/////////////////////////////////////////////////////////////////////////


	return 0;
}