コード例 #1
0
ファイル: tcphub.c プロジェクト: 7Robot/cerveau
int hub(const char * service)
{
	int sockserver;
	
	struct sockaddr_in address;
	socklen_t length = sizeof(struct sockaddr_in);

	if ((sockserver = create_tcp_server(NULL, service)) < 0) {
		return -1;
	}
	
	if (nonblock(sockserver) < 0) {
		return -1;
	}

	char buffer[BUF_SIZE];
	int sockclient[MAX_CONNECTION];
	int sockclientc = 0;

	int i, j, r, sock, run, dataread;

	fd_set listenfdset;

	run = 1;
	while (run) {
		FD_ZERO(&listenfdset);
		FD_SET(sockserver, &listenfdset);
		for (i = 0 ; i < sockclientc ; i++) {
			FD_SET(sockclient[i], &listenfdset);
		}

		if (select(FD_SETSIZE, &listenfdset, NULL, NULL, NULL) < 0) {
			if (errno != EINTR) {
				perror("select");
				return -1;
			} else {
				continue;
			}
		}

		if (FD_ISSET(sockserver, &listenfdset)) {
			if ((sock = accept(sockserver, (struct sockaddr*)(&address), &length)) < 0) {
				perror("accept");
				return -1;
			}
			if (nonblock(sock) < 0) {
				return -1;
			}
			if (sockclientc == MAX_CONNECTION) {
				char * toomanyco = "Sorry, no slot available, retry later\n";
				if (write(sock, toomanyco, strlen(toomanyco)) < -1) {
					perror("write");
				}
				close(sock);
			} else {
				sockclient[sockclientc++] = sock;
				fprintf(stdout, "%i connections [+1]\n", sockclientc);
				fflush(stdout);
			}
		}

		for (i = 0 ; i < sockclientc ; i++) {
			if (FD_ISSET(sockclient[i], &listenfdset)) {
				r = read(sockclient[i], buffer, BUF_SIZE);
				if (r <= 0) {
					close(sockclient[i]);
                    sockclient[i] = sockclient[--sockclientc];
					fprintf(stdout, "%i connections [-1]\n", sockclientc);
					fflush(stdout);
					if (r < 0 && errno != ECONNRESET) {
						perror("read");
						//return -1;
					}
				} else {
					if (dispatches(sockclientc, sockclient, i, r, buffer) < 0) {
						return -1;
					}
				}
			}
		}
	}
}
コード例 #2
0
ファイル: gxType.cpp プロジェクト: marcpage/gx
/** 
	@todo Still to setup
		Dispatch table methods
		Interface prototypes
		
*/
void Type::init() {
	static bool	inited= false;
	
	if(!inited) {
		Type	placeHolderType;
		
		inited= true;
		// create the types
		for(size_t type= 0; type < sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]); ++type) {
			const_cast<Type*>(gTypeBootStrapTable[type].type)->assign(new Extrinsic(placeHolderType, Type::kCountOfMembers), Pointer::DoNotRetain);
		}
		// create the interfaces
		for(size_t interface= 0; interface < sizeof(gInterfaceBootStrapTable)/sizeof(gInterfaceBootStrapTable[0]); ++interface) {
			gInterfaceBootStrapTable[interface].assign(new Extrinsic(Interface::type, Interface::kCountOfMembers), Pointer::DoNotRetain);
		}
		// assign interface of all interfaces
		for(size_t interface= 0; interface < sizeof(gInterfaceBootStrapTable)/sizeof(gInterfaceBootStrapTable[0]); ++interface) {
			gInterfaceBootStrapTable[interface]._interface= &gInterfaceBootStrapTable[iInterface].ref<GenericInstance>();
			Pointer::_retain(gInterfaceBootStrapTable[interface]._interface);
		}
		// initialize all Pointer types and interfaces
		for(size_t type= 0; type < sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]); ++type) {
			size_t	index= gTypeBootStrapTable[type].interfaceIndex;

			*const_cast<Type*>(gTypeBootStrapTable[type].type)= const_cast<GenericInstance*>(&Type::type.ref<GenericInstance>());
			*const_cast<Interface*>(gTypeBootStrapTable[type].interface)= gInterfaceBootStrapTable[index];
		}
		// set the name, parent and dispatches (and fill in interface of the dispatch)
		for(size_t type= 0; type < sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]); ++type) {
			size_t	index= gTypeBootStrapTable[type].interfaceIndex;
			List	dispatches(1);
			List	members(gTypeBootStrapTable[type].memberCount);
			List	constants(gTypeBootStrapTable[type].constantCount);
			
			dispatches.set(0, Dispatch(gInterfaceBootStrapTable[index]));
			const_cast<Type*>(gTypeBootStrapTable[type].type)->ref<Extrinsic>()[Name]= ASCIIText(gTypeBootStrapTable[type].name);
			const_cast<Type*>(gTypeBootStrapTable[type].type)->ref<Extrinsic>()[Parent]= Instance::type;
			const_cast<Type*>(gTypeBootStrapTable[type].type)->ref<Extrinsic>()[Dispatches]= dispatches;
			const_cast<Type*>(gTypeBootStrapTable[type].type)->ref<Extrinsic>()[Constants]= constants;
			const_cast<Type*>(gTypeBootStrapTable[type].type)->ref<Extrinsic>()[Members]= members;
		}
		
		// Fill in a list of all the known types so far
		List		typeList(sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]));
		
		for(size_t type= 0; type < sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]); ++type) {
			typeList.set(type, *gTypeBootStrapTable[type].type);
		}
		
		Type		*typeType= const_cast<Type*>(&Type::type); ///< Get Type's type to fix up
		List		&members= typeType->ref<Extrinsic>()[Members].ref<List>();
		List		&constants= typeType->ref<Extrinsic>()[Constants].ref<List>();
		Reference	allTypes(typeList);
		
		members.set(Name,		gInterfaceBootStrapTable[iText]);
		members.set(Parent,		gInterfaceBootStrapTable[iType]);
		members.set(Dispatches,	gInterfaceBootStrapTable[iList]);
		members.set(Constants,	gInterfaceBootStrapTable[iList]);
		members.set(Members,	gInterfaceBootStrapTable[iList]);
		constants.set(AllTypes,	allTypes);
		
		// call the init for every type
		for(size_t type= 0; type < sizeof(gTypeBootStrapTable)/sizeof(gTypeBootStrapTable[0]); ++type) {
			gTypeBootStrapTable[type].init();
		}
	}
}