Пример #1
0
void UdpService::postinitService() {
    createDatagramSocket();
    // define hardcoded remote address:
    remote_sockaddr_ipv4_ = sockaddr_ipv4_;
    remote_sockaddr_ipv4_.sin_addr.s_addr = inet_addr(boardIP_.to_string());

    if (timeout_.to_int64()) {
        struct timeval tv;
#if defined(_WIN32) || defined(__CYGWIN__)
        tv.tv_usec = 0;
        tv.tv_sec = static_cast<long>(timeout_.to_int64());
#else
        tv.tv_usec = (timeout_.to_int64() % 1000) * 1000;
        tv.tv_sec = static_cast<long>(timeout_.to_int64()/1000);
#endif

        setsockopt(hsock_, SOL_SOCKET, SO_RCVTIMEO, 
                            (char *)&tv, sizeof(struct timeval));
    }

    /** By default socket was created with Blocking mode */
    if (!blockmode_.to_bool()) {
        setBlockingMode(hsock_, false);
    }
}
Пример #2
0
COMPort::COMPort () : dcb (NULL) {
	dcb = new char [sizeof(DCB)];
	getState(); // Riempie il DCB con le impostazioni attuali della porta
	setBlockingMode();
	setHandshaking();
	open = false;
}
Пример #3
0
Socket::Socket(int _handle, const std::string& _hostLocal, unsigned _portLocal,
               struct sockaddr_storage* remoteAddr, IPVersion _ipVersion)
                :ipVersion(_ipVersion), type(TCP_SERVERS_CLIENT), status(READY),
                handle(_handle), hostLocal(_hostLocal), portLocal(_portLocal) {
    readSockaddr(remoteAddr, hostRemote, portRemote);
    setBlockingMode(false);
    #if NETLINK_DEFAULT_INPUT_BUFFER_SIZE > 0
    setInputBufferSize(NETLINK_DEFAULT_INPUT_BUFFER_SIZE);
    #endif
    #if NETLINK_DEFAULT_OUTPUT_BUFFER_SIZE > 0
    setOutputBufferSize(NETLINK_DEFAULT_OUTPUT_BUFFER_SIZE);
    #endif
}
Пример #4
0
int main( int argc, const char **argv )
{
   rtError rc;
   rtRemoteEnvironment *env= 0;
   const char* srcName= 0;
   const char* fileName= 0;
   const char* endpointName= 0;
   bool toFile= false;
   bool toEndpoint= false;
   int duration= -1;
   int len;

   printf("mediacapture-test v1.0\n");

   if ( argc > 4 )
   {
      showUsage();
   }
   else
   {
      if ( argc > 1 )
      {
         len= strlen(argv[1]);
         if ( (len == 4) && !strncmp( argv[1], "file", len) )
         {
            toFile= true;
         }
         else if ( (len == 8) && !strncmp( argv[1], "endpoint", len) )
         {
            toEndpoint= true;
         }
      }
      if ( argc > 2 )
      {
         if ( toFile )
         {
            fileName= argv[2];
         }
         else
         if ( toEndpoint )
         {
            endpointName= argv[2];
         }
      }
      if ( argc > 3 )
      {
         duration= atoi(argv[3]);
      }
      if ( !toFile && !toEndpoint )
      {
         showUsage();
         exit(0);
      }
      if ( duration < 0 )
      {
         duration= 30000;
      }

      printf("will capture to %s (%s)\n", (toFile?"file":"endpoint"), (toFile?fileName:endpointName));

      env= rtEnvironmentGetGlobal();

      rc= rtRemoteInit(env);
      if ( rc == RT_OK )
      {
         rtObjectRef registry;
         struct sigaction sigint;

         rc= rtRemoteLocateObject(env, "mediacaptureregistry", registry);
         if ( rc == RT_OK )
         {
            sigint.sa_handler= signalHandler;
            sigemptyset(&sigint.sa_mask);
	         sigint.sa_flags= SA_RESETHAND;
            sigaction(SIGINT, &sigint, NULL);

            setBlockingMode(NON_BLOCKING_ENABLED);

            listActions();
            gRunning= true;
            while( gRunning )
            {
               rtRemoteProcessSingleItem( env );
               if ( isKeyHit() )
               {
                  int src= -1;
                  int c= fgetc(stdin);
                  switch( c )
                  {
                     case '0':
                     case '1':
                     case '2':
                     case '3':
                     case '4':
                     case '5':
                     case '6':
                     case '7':
                     case '8':
                     case '9':
                        src= c-'0';
                        getAvailablePipelines(env, registry);
                        if ( toFile )
                        {
                           captureSourceToFile( src, fileName, duration, env );
                        }
                        else
                        {
                           startCaptureSourceToEndpoint( src, endpointName, duration, env );
                        }
                        break;
                     case 's':
                        if ( !toFile )
                        {
                           if ( gSrcActive != -1 )
                           {
                              stopCaptureSourceToEndpoint( gSrcActive, env );
                           }
                        }
                        break;
                     case 'l':
                        displayPipelineList(env, registry);
                        break;
                     case 'i':
                        displayMediaConsumptionInfo(env, registry);
                        break;
                     case 'c':
                        clearMediaConsumptionInfo(env, registry);
                        break;
                     case 'q':
                        gRunning= false;
                        break;
                     default:
                        listActions();
                        break;
                  }
               }
               usleep( 10000 );
            }

            setBlockingMode(NON_BLOCKING_DISABLED);
         }
         else
         {
            printf("error: unable to locate registry: %d", rc);
         }

      }
      else
      {
         printf("error: rtRemoteInit rc %d\n", rc);
      }

   }

   return 0;
}
Пример #5
0
void MprSocket::close(int timeout)
{
	MprSelectService	*ss;
	Mpr					*mpr;
	char				buf[1024];
	int					handlerFlags, timesUp;

	mpr = mprGetMpr();

	mprLog(7, log, "%d: close\n", sock);
	ss = mpr->selectService;

	lock();
	mprAssert(!(flags & MPR_SOCKET_CLOSED));
	if (flags & MPR_SOCKET_CLOSED) {
		unlock();
		return;
	}
	flags |= MPR_SOCKET_CLOSED;
	handlerFlags = (handler) ? handler->getFlags() : 0;

	if (handler) {
		handler->dispose();
		handler = 0;
	}

	if (sock >= 0) {
		//
		//	Do a graceful shutdown. Read any outstanding read data to prevent
		//	resets. Then do a shutdown to send a FIN and read outstanding 
		//	data. All non-blocking.
		//
//TODO - what about WINCE?
#if WIN
		if (ss->getFlags() & MPR_ASYNC_SELECT) {

			if (handlerFlags & MPR_SELECT_CLIENT_CLOSED) {
				//
				//	Client initiated close. We have already received an FD_CLOSE
				//
				closesocket(sock);
				sock = -1;

			} else {

				if (shutdown(sock, SHUT_WR) == 0) {
					//
					//	Do a graceful shutdown. Read any outstanding read data to 
					//	prevent resets. Then do a shutdown to send a FIN and lastly
					//	read data when the FD_CLOSE is received (see select.cpp). 
					//	All done non-blocking.
					//
					timesUp = mprGetTime(0) + timeout;
					do {
    					if (recv(sock, buf, sizeof(buf), 0) <= 0) {
							break;
						}
					} while (mprGetTime(0) < timesUp);
				}

				//
				//	Delayed close call must be first so we are ready when the
				//	FD_CLOSE arrives. Other way round and there is a race if 
				//	multi-threaded. 
				//
				ss->delayedClose(sock);

				//
				//	We need to ensure we receive an FD_CLOSE to complete the
				//	delayed close. Despite disposing the hander above, socket 
				//	messages will still be sent from windows and so select can 
				//	cleanup the delayed close socket.
				//
				WSAAsyncSelect(sock, ss->getHwnd(), ss->getMessage(), FD_CLOSE);
			}
		
		} else {
#endif
			if (shutdown(sock, SHUT_WR) < 0) {
				ss->delayedClose(sock);

			} else {
				setBlockingMode(0);
				timesUp = mprGetTime(0) + timeout;
				do {
					if (recv(sock, buf, sizeof(buf), 0) <= 0) {
						break;
					}
					
				} while (mprGetTime(0) < timesUp);
			}

			//
			//	Use delayed close to prevent anyone else reusing the socket
			//	while select has not fully cleaned it out of its masks.
			//
			ss->delayedClose(sock);
			ss->awaken(0);
		}
#if WIN
	}
#endif

	//
	//	Re-initialize all socket variables so the Socket can be reused.
	//
	acceptCallback = 0;
	acceptData = 0;
	selectEvents = 0;
	currentEvents = 0;
	error = 0;
	flags = MPR_SOCKET_CLOSED;
	ioCallback = 0;
	ioData = 0;
	ioData2 = 0;
	handlerMask = 0;
	handlerPriority = MPR_NORMAL_PRIORITY;
	interestEvents = 0;
	port = -1;
	sock = -1;

	if (ipAddr) {
		mprFree(ipAddr);
		ipAddr = 0;
	}

	unlock();
}
Пример #6
0
int MprSocket::openClient(char *addr, int portNum, int initialFlags)
{
#if BLD_FEATURE_IPV6
	struct addrinfo 	hints, *res;
	struct sockaddr_storage	remoteAddr6;
	char 				portNum_string[MPR_MAX_IP_PORT];
	char 				addrBuf[MPR_MAX_IP_ADDR];
#endif
	struct sockaddr_in	remoteAddr;
	struct hostent		*hostent;
	struct sockaddr 	*sa;
	MprSocklen			addrlen;
	int					broadcast, datagram, rc, err;

	mprLog(6, log, "openClient: %s:%d, flags %x\n", addr, portNum, 
		initialFlags);

#if BLD_FEATURE_IPV6
	if (addr[0] == '[') {
		ipv6 = 1;
		mprStrcpy(addrBuf, sizeof(addr), &addr[1]);
		mprAssert(addrBuf[strlen(addrBuf) - 2] == ']');
		addrBuf[strlen(addrBuf) - 2] = '\0';
		addr = addrBuf;
	} else {
        ipv6 = 0;
    }

	if (ipv6) {
		memset((char*) &hints, '\0', sizeof(hints));
		memset((char*) &remoteAddr6, '\0', sizeof(struct sockaddr_storage));

		mprSprintf(portNum_string, sizeof(portNum_string), "%d", portNum);

		hints.ai_socktype = SOCK_STREAM;

		rc = getaddrinfo(addr, portNum_string, &hints, &res);
		if (rc) {
			/* no need to unlock yet */
			return MPR_ERR_CANT_OPEN;

		}
		sa = (struct sockaddr*) &remoteAddr6;
		memcpy(sa, res->ai_addr, res->ai_addrlen);
		addrlen = res->ai_addrlen;
		freeaddrinfo(res);
		
	} else 
#endif
	{
		memset((char *) &remoteAddr, '\0', sizeof(struct sockaddr_in));
		remoteAddr.sin_family = AF_INET;
		remoteAddr.sin_port = htons((short) (portNum & 0xFFFF));
		sa = (struct sockaddr*) &remoteAddr;
		addrlen = sizeof(remoteAddr);
	}
		
	lock();
	port = portNum;
	flags = (initialFlags & 
		(MPR_SOCKET_BROADCAST | MPR_SOCKET_DATAGRAM | MPR_SOCKET_BLOCK | 
		 MPR_SOCKET_LISTENER | MPR_SOCKET_NOREUSE | MPR_SOCKET_NODELAY));

	//	Save copy of the address
	ipAddr = mprStrdup(addr);

#if BLD_FEATURE_IPV6
	if (!ipv6) {
		// Nothing here
	} else 
#endif
	{
		remoteAddr.sin_addr.s_addr = inet_addr(ipAddr);
		if (remoteAddr.sin_addr.s_addr == INADDR_NONE) {
			hostent = mprGetHostByName(ipAddr);
			if (hostent != 0) {
				memcpy((char*) &remoteAddr.sin_addr, (char*) hostent->h_addr_list[0], 
					(size_t) hostent->h_length);
				mprFreeGetHostByName(hostent);
			} else {
				unlock();
				return MPR_ERR_NOT_FOUND;
			}
		}
	}

	broadcast = flags & MPR_SOCKET_BROADCAST;
	if (broadcast) {
		flags |= MPR_SOCKET_DATAGRAM;
	}
	datagram = flags & MPR_SOCKET_DATAGRAM;

	//
	//	Create the O/S socket
	//
	sock = socket(sa->sa_family, datagram ? SOCK_DGRAM: SOCK_STREAM, 0);
	if (sock < 0) {
		err = getError();
		unlock();
		return -err;
	}
#if !WIN && !WINCE && !VXWORKS
	fcntl(sock, F_SETFD, FD_CLOEXEC);		// Children won't inherit this fd
#endif

	if (broadcast) {
		int	flag = 1;
		if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *) &flag, sizeof(flag)) < 0) {
			err = getError();
			::closesocket(sock);
			sock = -1;
			unlock();
			return -err;
		}
	}
 
	if (!datagram) {
		flags |= MPR_SOCKET_CONNECTING;
		rc = connect(sock, sa, addrlen);
		if (rc < 0) {
			err = getError();
			::closesocket(sock);
			sock = -1;
			unlock();
#if UNUSED
			//
			//	If the listen backlog is too high, ECONNREFUSED is returned
			//
			if (err == EADDRINUSE || err == ECONNREFUSED) {
				return MPR_ERR_BUSY;
			}
#endif
			return -err;
		}
	}

	setBlockingMode((bool) (flags & MPR_SOCKET_BLOCK));

	//
	//	TCP/IP stacks have the No delay option (nagle algorithm) on by default.
	//
	if (flags & MPR_SOCKET_NODELAY) {
		setNoDelay(1);
	}
	unlock();
	return sock;
}
Пример #7
0
int MprSocket::openServer(char *addr, int portNum, MprSocketAcceptProc acceptFn, 
						  void *data, int initialFlags)
{
#if BLD_FEATURE_IPV6
	struct addrinfo		hints, *res;
	struct sockaddr_storage	sockAddr6;
	char 				portNumString[MPR_MAX_IP_PORT];
	char 				addrBuf[MPR_MAX_IP_ADDR];
	char 				*bindName;
#endif
	struct sockaddr_in	sockAddr;
	struct sockaddr 	*sa;
	struct hostent		*hostent;
	MprSocklen 			addrlen;
	int					datagram, rc;

	mprAssert(addr);

	if (addr == 0 || *addr == '\0') {
		mprLog(6, log, "openServer: *:%d, flags %x\n", portNum, initialFlags);
	} else {
		mprLog(6, log, "openServer: %s:%d, flags %x\n", addr, portNum, initialFlags);
	}


#if BLD_FEATURE_IPV6

	if (addr[0] == '[') {
		ipv6 = 1;
		mprStrcpy(addrBuf, sizeof(addrBuf), &addr[1]);
		mprAssert(addrBuf[strlen(addrBuf) - 1] == ']');
		addrBuf[strlen(addrBuf) - 1] = '\0';
		addr = addrBuf;
	}

	if (ipv6) {
		memset((char *) &hints, '\0', sizeof(hints));
		memset((char *) &sockAddr6, '\0', sizeof(struct sockaddr_storage));

		mprSprintf(portNumString, sizeof(portNumString), "%d", portNum);

		hints.ai_socktype = SOCK_STREAM;
		hints.ai_family = AF_INET6;

		if (strcmp(addr, "") != 0) {
			bindName = addr;
		} else {
			bindName = NULL;
			hints.ai_flags |= AI_PASSIVE; 				/* Bind to 0.0.0.0 and :: */
														/* Sets to IN6ADDR_ANY_INIT */
		}
			
		rc = getaddrinfo(bindName, portNumString, &hints, &res);
		if (rc) {
			return MPR_ERR_CANT_OPEN;

		}
		sa = (struct sockaddr*) &sockAddr6;
		memcpy(sa, res->ai_addr, res->ai_addrlen);
		addrlen = res->ai_addrlen;
		freeaddrinfo(res);

	} else 
#endif
	{
		/*
		 *	TODO could we use getaddrinfo in all cases. ie. merge with IPV6 code
		 */
		memset((char *) &sockAddr, '\0', sizeof(struct sockaddr_in));
		addrlen = sizeof(struct sockaddr_in);
		sockAddr.sin_family = AF_INET;

		sockAddr.sin_port = htons((short) (portNum & 0xFFFF));
		if (strcmp(addr, "") != 0) {
			sockAddr.sin_addr.s_addr = inet_addr(addr);
			if (sockAddr.sin_addr.s_addr == INADDR_NONE) {
				hostent = mprGetHostByName(addr);
				if (hostent != 0) {
					memcpy((char*) &sockAddr.sin_addr, (char*) hostent->h_addr_list[0], 
						(size_t) hostent->h_length);
					mprFreeGetHostByName(hostent);
				} else {
					return MPR_ERR_NOT_FOUND;
				}
			}
		} else {
			sockAddr.sin_addr.s_addr = INADDR_ANY;
		}
		sa = (struct sockaddr*) &sockAddr;
	}

	lock();
	port = portNum;
	acceptCallback = acceptFn;
	acceptData = data;

	flags = (initialFlags & 
		(MPR_SOCKET_BROADCAST | MPR_SOCKET_DATAGRAM | MPR_SOCKET_BLOCK | 
		 MPR_SOCKET_LISTENER | MPR_SOCKET_NOREUSE | MPR_SOCKET_NODELAY));

	ipAddr = mprStrdup(addr);

	datagram = flags & MPR_SOCKET_DATAGRAM;

	//
	//	Create the O/S socket
	//
	sock = socket(sa->sa_family, datagram ? SOCK_DGRAM: SOCK_STREAM, 0);
	if (sock < 0) {
		unlock();
		return MPR_ERR_CANT_OPEN;
	}
#if !WIN && !WINCE && !VXWORKS
	fcntl(sock, F_SETFD, FD_CLOEXEC);		// Children won't inherit this fd
#endif

#if CYGWIN || LINUX || MACOSX || VXWORKS || FREEBSD
	if (!(flags & MPR_SOCKET_NOREUSE)) {
		rc = 1;
		setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &rc, sizeof(rc));
	}
#endif

	rc = bind(sock, sa, addrlen);
	// rc = bind(sock, res->ai_addr, res->ai_addrlen);
	if (rc < 0) {
		int err = errno;
		err = err;
		::closesocket(sock);
		sock = -1;
		unlock();
		return MPR_ERR_CANT_OPEN;
	}

	if (! datagram) {
		flags |= MPR_SOCKET_LISTENER;
		if (listen(sock, SOMAXCONN) < 0) {
			::closesocket(sock);
			sock = -1;
			unlock();
			return MPR_ERR_CANT_OPEN;
		}
		handler = new MprSelectHandler(sock, MPR_SOCKET_READABLE, 
			(MprSelectProc) acceptProcWrapper, (void*) this, handlerPriority);
	}
	handlerMask |= MPR_SOCKET_READABLE;

//TODO - what about WINCE?
#if WIN
	//
	//	Delay setting reuse until now so that we can be assured that we
	//	have exclusive use of the port.
	//
	if (!(flags & MPR_SOCKET_NOREUSE)) {
		rc = 1;
		setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &rc, sizeof(rc));
	}
#endif

	setBlockingMode((bool) (flags & MPR_SOCKET_BLOCK));

	//
	//	TCP/IP stacks have the No delay option (nagle algorithm) on by default.
	//
	if (flags & MPR_SOCKET_NODELAY) {
		setNoDelay(1);
	}
	unlock();
	return sock;
}
Пример #8
0
void Socket::initSocket(bool blockingConnect) {
    AddrinfoContainer info;

    if(type == TCP_CLIENT)
        info = getSocketInfoFor(hostRemote.c_str(), portRemote, false);
    else{
        const char* host;
        if(!hostLocal.compare("") || !hostLocal.compare("*"))
            host = NULL;
        else
            host = hostLocal.c_str();
        info = getSocketInfoFor(host, portLocal, true);
    }

    struct addrinfo* nextAddr = info.get();
    while(nextAddr) {
        handle = socket(nextAddr->ai_family, nextAddr->ai_socktype, nextAddr->ai_protocol);
        if(handle == -1) {
            nextAddr = nextAddr->ai_next;
            continue;
        }

        setBlockingMode(blockingConnect);
		#ifdef WIN32
		char flag = 1;
		#else
		int flag = 1;
		#endif
        if(setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) == -1) {
            disconnect();
            throw Exception(Exception::ERROR_SET_SOCK_OPT);
        }

        switch(nextAddr->ai_family) {
            case AF_INET:
                ipVersion = IPv4;
            break;
            case AF_INET6:
                ipVersion = IPv6;
            break;
        }

        switch(type) {
            case NONE:
            case TCP_SERVERS_CLIENT:
                disconnect();
                throw Exception(Exception::BAD_TYPE);
            case TCP_CLIENT:
                if(connect(handle, nextAddr->ai_addr, nextAddr->ai_addrlen) == -1 && blockingConnect) {
					closesocket(handle);
                    handle = -1;
                }else if(blockingConnect)
                    status = READY;
                else
                    status = CONNECTING;
            break;
            case TCP_SERVER: {
                if(bind(handle, nextAddr->ai_addr, nextAddr->ai_addrlen) == -1) {
					closesocket(handle);
                    handle = -1;
                }

                if(listen(handle, status) == -1) {
                    disconnect();
                    throw Exception(Exception::ERROR_INIT);
                }
            } break;
            case UDP_PEER: {
                if(bind(handle, nextAddr->ai_addr, nextAddr->ai_addrlen) == -1) {
					closesocket(handle);
                    handle = -1;
                }

                status = READY;
            } break;
        }
        if(handle == -1) {
            nextAddr = nextAddr->ai_next;
            continue;
        }

        if(blockingConnect)
            setBlockingMode(false);
        break;
    }

    if(handle == -1) {
        disconnect();
        throw Exception(Exception::ERROR_INIT);
    }

    struct sockaddr_storage localAddr;
	#ifdef WIN32
    int size = sizeof(localAddr);
	#else
	unsigned int size = sizeof(localAddr);
	#endif
    if(getsockname(handle, reinterpret_cast<struct sockaddr*>(&localAddr), &size) != 0) {
        disconnect();
        throw Exception(Exception::ERROR_GET_SOCK_NAME);
    }

    readSockaddr(&localAddr, hostLocal, portLocal);
}
Пример #9
0
void MSListener::doOpen(void)
{
  if (fd()<0)
   {
     int lfd;
     initRetryTimer();
     
     if ((lfd=socket(domain(),type(),protocol()))<0)
      {
        MSMessageLog::warningMessage("MSListener::open(%s): error: socket()\n",name().string());
	close();
        return;
      }
     _openTod=todsec();
     _openCount++;
     MSChannel::fdsfresh(lfd);
     _fd=lfd;

     setBlockingMode(_fd);

     int toggle=1;

     if (setsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,(char *)(&toggle),sizeof(toggle))<0)
      {
        MSMessageLog::warningMessage("MSListener::open(%s): warning: setsockopt(%d,REUSEADDR)\n",name().string(),fd());
      }
     if (establish()==MSFalse)
      {
	close();
	return;
      }
     if (localName()==(struct sockaddr *)(0))
      {
	_localName=(struct sockaddr *)new char[localNamelen()];
        memset((char *)(localName()),0,localNamelen());
      }
     else
      {
	if (bind(fd(),localName(),localNamelen())<0)
	 {
           MSMessageLog::warningMessage("MSListener::open(%s): error: bind(%d)\n",name().string(),fd());
	   close();
	   return;
	 }
      }
     if (listen(fd(),5)<0)
      {
        MSMessageLog::warningMessage("MSListener::open(%s): error: listen(%d)\n",name().string(),fd());
	close();
	return;
      }
#if defined(HAVE_SOCKLEN_T)
     if (getsockname(fd(),localName(),(socklen_t *)&_localNamelen)<0)
#else
     if (getsockname(fd(),localName(),&_localNamelen)<0)
#endif
      {
        MSMessageLog::warningMessage("MSListener::open(%s): error: getsockname(%d)\n",name().string(),fd());
	close();
	return;
      }
     if (publish()==MSFalse)
      {
	close();
	return;
      }

     _listenTod=todsec();
     _listenCount++;
     createAcceptChannel();
     _retryTime.reset();
   }
}