Пример #1
0
int main(int argc, char ** argv)
{
  x4s_ike_config c = 
  {
    on_ph1_initiated,
    on_ph1_completed,
    on_ph1_disposed,
    on_ph1_sa_used,
    on_ph1_validate,
    on_ph1_send,
    0, //on_ph1_resend,
    on_ph1_float,
    on_ph1_get_psk,
    on_ph1_get_cert,
    on_ph1_get_prikey,
    on_ph1_get_pubkey,

    on_ph2_initiated,
    on_ph2_responded,
    on_ph2_completed,
    on_ph2_disposed,
    on_ph2_validate,
    on_ph2_send,
    0, //on_ph2_resend,
    on_ph2_get_spi,
    
    bfalse,
    bfalse,
    32,
    0xffff
  };

  x4s_ike_config1 ph1 = { 0 };
  void * ph1context;

  uint32 a;
  int alen;

  /*  */
  x4_logf_set(on_logf);

  /*  */
  x4_crypto_init();

  /* decide who's the peer */
  a = inet_addr("195.20.116.69"); //195.20.116.71");
  x4_memmove(&r.sin_addr, &a, 4);

  /* create */
  s = socket(PF_INET, SOCK_DGRAM, 0);

  /* unblock */
  socket_unblock(s);

  /* bind */
  bind(s, (struct sockaddr*)&l, sizeof(l));

  /* connect */
  connect(s, (struct sockaddr*)&r, sizeof(r));

  /* get IP we are bound to */
  alen = sizeof(l);
  getsockname(s, (struct sockaddr*)&l, &alen);

  /*  */
  x4_charon_init(&c);

  /*  */
  ph1.hash   = x4c_ike_a1h_sha1;
  ph1.cipher = x4c_ike_a1e_aes_cbc;
  ph1.group  = x4c_ike_a1g_modp_1024;
  ph1.auth   = x4c_ike_a1a_preshared;
  ph1.kbits  = 128;
  ph1.nlen   = 16;
  ph1.userdata = &ph1context;

  ph1.link.type = x4c_net_ip_v4;
  x4_memmove(ph1.link.l.ip.v4, &l.sin_addr, 4);
  ph1.link.l.port = 500;

  ph1.link.type = x4c_net_ip_v4;
  x4_memmove(ph1.link.r.ip.v4, &r.sin_addr, 4);
  ph1.link.r.port = 500;

  /* ph1.natt = 0xff; */
  
  x4_charon_init1(&ph1);

  for (;;)
  {
    struct timeval tv = { 0, 500000 };  /* 50 msec */
    fd_set fdr, fde;

    FD_ZERO(&fdr); FD_SET(s, &fdr);
    FD_ZERO(&fde); FD_SET(s, &fde);
    
    if (select(s+1, &fdr, 0, &fde, &tv) < 0)
    {
      x4_info("select() failed w %u\n", socket_error());
      break;
    }

    if (FD_ISSET(s, &fdr))
    {
      static char buf[1500];
      int  n;

      n = socket_recv(s, buf, sizeof(buf));
      if (n > 0)
      {
        x4s_buf pkt = { 0 };
      
        x4_info(">> %u\n", n);
        x4_buf_attach(&pkt, buf, n);  
        x4_charon_recv(&ph1.link, &pkt);
      }
    }

    if (FD_ISSET(s, &fde))
    {
      x4_info("socket error %u\n", socket_error());
      break;
    }
     
    x4_charon_tick();
  }

  return 0;
}
static int socket_errno(FdMigrationState *s)
{
    return socket_error();
}
    void connect()
    {
        Q_ASSERT(m_service);
        //qDebug() << "Connecting to: " << m_service->serviceInfo()->device().address().toString();
        m_error = QDeclarativeBluetoothSocket::NoError;

        if (m_socket)
            m_socket->deleteLater();

        QBluetoothServiceInfo::Protocol socketProtocol;
        if (m_service->serviceInfo()->socketProtocol() == QBluetoothServiceInfo::L2capProtocol)
            socketProtocol = QBluetoothServiceInfo::L2capProtocol;
        else if (m_service->serviceInfo()->socketProtocol() == QBluetoothServiceInfo::RfcommProtocol)
            socketProtocol = QBluetoothServiceInfo::RfcommProtocol;
        else
            socketProtocol = QBluetoothServiceInfo::UnknownProtocol;

        m_socket = new QBluetoothSocket(socketProtocol);
        m_socket->connectToService(*m_service->serviceInfo());
        QObject::connect(m_socket, SIGNAL(connected()), m_dbs, SLOT(socket_connected()));
        QObject::connect(m_socket, SIGNAL(disconnected()), m_dbs, SLOT(socket_disconnected()));
        QObject::connect(m_socket, SIGNAL(error(QBluetoothSocket::SocketError)), m_dbs, SLOT(socket_error(QBluetoothSocket::SocketError)));
        QObject::connect(m_socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), m_dbs, SLOT(socket_state(QBluetoothSocket::SocketState)));
        QObject::connect(m_socket, SIGNAL(readyRead()), m_dbs, SLOT(socket_readyRead()));
    }
Пример #4
0
  Message receive(
      web::socket const & s
    , std::chrono::seconds timeout_in
  )
  {
      static_assert(
          elib::aux::is_same<Message, request>::value
          || elib::aux::is_same<Message, response>::value
        , "The only two choices"
      );
      
      Message msg;
      data_type buff(10024);
      data_type remaining;
      
      
      
      const auto timeout_at = std::chrono::system_clock::now() + timeout_in;
                       
      auto timeout_receive = 
          [&]()
          {
              std::error_code ec;
              while (std::chrono::system_clock::now() < timeout_at)
              {
                  ec.clear();
                  ::ssize_t ret = web::receive(s, buff, ec);
                  if (ec.value() == EAGAIN || ec.value() == EWOULDBLOCK)
                      continue;
                  if (ec)
                  {
                      ELIB_THROW_EXCEPTION(socket_error(
                          elib::fmt(
                              "http::receive failed with error %s"
                            , ec.message()
                          )
                        , ec
                      ));
                  }
                  ELIB_ASSERT(ret >= 0);
                  std::copy_n(
                      buff.begin()
                    , static_cast<std::size_t>(ret)
                    , std::back_inserter(remaining)
                  );
             
                  return ret;
              }
              
              ELIB_THROW_EXCEPTION(web_error(
                  "http::receive timed out"
              ));
          };
         
      // get header
 
      while (true)
      {
          timeout_receive();
  
          auto pos = parse(remaining.begin(), remaining.end(), msg.header);
          
          if (pos == remaining.begin()) continue;
          
          remaining.erase(remaining.begin(), pos);
          break;
      }
      // get fields and newline
      while (true)
      {
          auto field_end = parse(remaining.begin(), remaining.end(), msg.fields);
          remaining.erase(remaining.begin(), field_end);
          
          auto newl_end = parse_newl(remaining.begin(), remaining.end());
          
          bool have_newl = newl_end != remaining.begin();
          
          remaining.erase(remaining.begin(), newl_end);
          
          if (have_newl) break;
              
          // receive must only happen if we fail to parse till the 
          // newline break. othewise we could be waiting on a message
          // we already have
          timeout_receive();
      }
      
     
      std::size_t const con_size = content_size(msg);
      ELIB_ASSERT(con_size >= remaining.size());
      
      // get remaining data if needed 
      while (remaining.size() != con_size)
      {
          timeout_receive();                
      }
      
      msg.data.insert(msg.data.end(), remaining.begin(), remaining.end());
      
      return msg;
  }
    void connect()
    {
        Q_ASSERT(m_service);
        qDebug() << "Connecting to: " << m_service->serviceInfo()->device().address().toString();
        m_error = QLatin1String("No Error");

        if(m_socket)
            m_socket->deleteLater();

//        delete m_socket;
        m_socket = new QBluetoothSocket();
        m_socket->connectToService(*m_service->serviceInfo());
        QObject::connect(m_socket, SIGNAL(connected()), m_dbs, SLOT(socket_connected()));
        QObject::connect(m_socket, SIGNAL(disconnected()), m_dbs, SLOT(socket_disconnected()));
        QObject::connect(m_socket, SIGNAL(error(QBluetoothSocket::SocketError)), m_dbs, SLOT(socket_error(QBluetoothSocket::SocketError)));
        QObject::connect(m_socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), m_dbs, SLOT(socket_state(QBluetoothSocket::SocketState)));
        QObject::connect(m_socket, SIGNAL(readyRead()), m_dbs, SLOT(socket_readyRead()));

        m_stream = new QDataStream(m_socket);
    }
Пример #6
0
int inet_connect_opts(QemuOpts *opts, Error **errp)
{
    struct addrinfo ai,*res,*e;
    const char *addr;
    const char *port;
    char uaddr[INET6_ADDRSTRLEN+1];
    char uport[33];
    int sock,rc;
    bool block;

    memset(&ai,0, sizeof(ai));
    ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
    ai.ai_family = PF_UNSPEC;
    ai.ai_socktype = SOCK_STREAM;

    addr = qemu_opt_get(opts, "host");
    port = qemu_opt_get(opts, "port");
    block = qemu_opt_get_bool(opts, "block", 0);
    if (addr == NULL || port == NULL) {
        fprintf(stderr, "inet_connect: host and/or port not specified\n");
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
        return -1;
    }

    if (qemu_opt_get_bool(opts, "ipv4", 0))
        ai.ai_family = PF_INET;
    if (qemu_opt_get_bool(opts, "ipv6", 0))
        ai.ai_family = PF_INET6;

    /* lookup */
    if (0 != (rc = getaddrinfo(addr, port, &ai, &res))) {
        fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
                gai_strerror(rc));
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
	return -1;
    }

    for (e = res; e != NULL; e = e->ai_next) {
        if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
                            uaddr,INET6_ADDRSTRLEN,uport,32,
                            NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
            fprintf(stderr,"%s: getnameinfo: oops\n", __FUNCTION__);
            continue;
        }
        sock = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol);
        if (sock < 0) {
            fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__,
            inet_strfamily(e->ai_family), strerror(errno));
            continue;
        }
        setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
        if (!block) {
            socket_set_nonblock(sock);
        }
        /* connect to peer */
        do {
            rc = 0;
            if (connect(sock, e->ai_addr, e->ai_addrlen) < 0) {
                rc = -socket_error();
            }
        } while (rc == -EINTR);

  #ifdef _WIN32
        if (!block && (rc == -EINPROGRESS || rc == -EWOULDBLOCK
                       || rc == -WSAEALREADY)) {
  #else
        if (!block && (rc == -EINPROGRESS)) {
  #endif
            error_set(errp, QERR_SOCKET_CONNECT_IN_PROGRESS);
        } else if (rc < 0) {
            if (NULL == e->ai_next)
                fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__,
                        inet_strfamily(e->ai_family),
                        e->ai_canonname, uaddr, uport, strerror(errno));
            closesocket(sock);
            sock = -1;
            continue;
        }
        freeaddrinfo(res);
        return sock;
    }
    error_set(errp, QERR_SOCKET_CONNECT_FAILED);
    freeaddrinfo(res);
    return -1;
}

int inet_dgram_opts(QemuOpts *opts)
{
    struct addrinfo ai, *peer = NULL, *local = NULL;
    const char *addr;
    const char *port;
    char uaddr[INET6_ADDRSTRLEN+1];
    char uport[33];
    int sock = -1, rc;

    /* lookup peer addr */
    memset(&ai,0, sizeof(ai));
    ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
    ai.ai_family = PF_UNSPEC;
    ai.ai_socktype = SOCK_DGRAM;

    addr = qemu_opt_get(opts, "host");
    port = qemu_opt_get(opts, "port");
    if (addr == NULL || strlen(addr) == 0) {
        addr = "localhost";
    }
    if (port == NULL || strlen(port) == 0) {
        fprintf(stderr, "inet_dgram: port not specified\n");
        return -1;
    }

    if (qemu_opt_get_bool(opts, "ipv4", 0))
        ai.ai_family = PF_INET;
    if (qemu_opt_get_bool(opts, "ipv6", 0))
        ai.ai_family = PF_INET6;

    if (0 != (rc = getaddrinfo(addr, port, &ai, &peer))) {
        fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
                gai_strerror(rc));
	return -1;
    }

    /* lookup local addr */
    memset(&ai,0, sizeof(ai));
    ai.ai_flags = AI_PASSIVE;
    ai.ai_family = peer->ai_family;
    ai.ai_socktype = SOCK_DGRAM;

    addr = qemu_opt_get(opts, "localaddr");
    port = qemu_opt_get(opts, "localport");
    if (addr == NULL || strlen(addr) == 0) {
        addr = NULL;
    }
    if (!port || strlen(port) == 0)
        port = "0";

    if (0 != (rc = getaddrinfo(addr, port, &ai, &local))) {
        fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
                gai_strerror(rc));
        return -1;
    }

    /* create socket */
    sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol);
    if (sock < 0) {
        fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__,
                inet_strfamily(peer->ai_family), strerror(errno));
        goto err;
    }
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));

    /* bind socket */
    if (getnameinfo((struct sockaddr*)local->ai_addr,local->ai_addrlen,
                    uaddr,INET6_ADDRSTRLEN,uport,32,
                    NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
        fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__);
        goto err;
    }
    if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) {
        fprintf(stderr,"%s: bind(%s,%s,%d): OK\n", __FUNCTION__,
                inet_strfamily(local->ai_family), uaddr, inet_getport(local));
        goto err;
    }

    /* connect to peer */
    if (getnameinfo((struct sockaddr*)peer->ai_addr, peer->ai_addrlen,
                    uaddr, INET6_ADDRSTRLEN, uport, 32,
                    NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
        fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__);
        goto err;
    }
    if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) {
        fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__,
                inet_strfamily(peer->ai_family),
                peer->ai_canonname, uaddr, uport, strerror(errno));
        goto err;
    }

    freeaddrinfo(local);
    freeaddrinfo(peer);
    return sock;

err:
    if (-1 != sock)
        closesocket(sock);
    if (local)
        freeaddrinfo(local);
    if (peer)
        freeaddrinfo(peer);
    return -1;
}

/* compatibility wrapper */
static int inet_parse(QemuOpts *opts, const char *str)
{
    const char *optstr, *h;
    char addr[64];
    char port[33];
    int pos;

    /* parse address */
    if (str[0] == ':') {
        /* no host given */
        addr[0] = '\0';
        if (1 != sscanf(str,":%32[^,]%n",port,&pos)) {
            fprintf(stderr, "%s: portonly parse error (%s)\n",
                    __FUNCTION__, str);
            return -1;
        }
    } else if (str[0] == '[') {
        /* IPv6 addr */
        if (2 != sscanf(str,"[%64[^]]]:%32[^,]%n",addr,port,&pos)) {
            fprintf(stderr, "%s: ipv6 parse error (%s)\n",
                    __FUNCTION__, str);
            return -1;
        }
        qemu_opt_set(opts, "ipv6", "on");
    } else if (qemu_isdigit(str[0])) {
        /* IPv4 addr */
        if (2 != sscanf(str,"%64[0-9.]:%32[^,]%n",addr,port,&pos)) {
            fprintf(stderr, "%s: ipv4 parse error (%s)\n",
                    __FUNCTION__, str);
            return -1;
        }
        qemu_opt_set(opts, "ipv4", "on");
    } else {
        /* hostname */
        if (2 != sscanf(str,"%64[^:]:%32[^,]%n",addr,port,&pos)) {
            fprintf(stderr, "%s: hostname parse error (%s)\n",
                    __FUNCTION__, str);
            return -1;
        }
    }
    qemu_opt_set(opts, "host", addr);
    qemu_opt_set(opts, "port", port);

    /* parse options */
    optstr = str + pos;
    h = strstr(optstr, ",to=");
    if (h)
        qemu_opt_set(opts, "to", h+4);
    if (strstr(optstr, ",ipv4"))
        qemu_opt_set(opts, "ipv4", "on");
    if (strstr(optstr, ",ipv6"))
        qemu_opt_set(opts, "ipv6", "on");
    return 0;
}

int inet_listen(const char *str, char *ostr, int olen,
                int socktype, int port_offset, Error **errp)
{
    QemuOpts *opts;
    char *optstr;
    int sock = -1;

    opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
    if (inet_parse(opts, str) == 0) {
        sock = inet_listen_opts(opts, port_offset, errp);
        if (sock != -1 && ostr) {
            optstr = strchr(str, ',');
            if (qemu_opt_get_bool(opts, "ipv6", 0)) {
                snprintf(ostr, olen, "[%s]:%s%s",
                         qemu_opt_get(opts, "host"),
                         qemu_opt_get(opts, "port"),
                         optstr ? optstr : "");
            } else {
                snprintf(ostr, olen, "%s:%s%s",
                         qemu_opt_get(opts, "host"),
                         qemu_opt_get(opts, "port"),
                         optstr ? optstr : "");
            }
        }
    } else {
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
    }
    qemu_opts_del(opts);
    return sock;
}
Пример #7
0
static socket_udp *udp_init4(const char *addr, const char *iface,
                             uint16_t rx_port, uint16_t tx_port, int ttl)
{
        int reuse = 1;
        int udpbufsize = 16 * 1024 * 1024;
        struct sockaddr_in s_in;
        unsigned int ifindex;
        socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp));
        s->mode = IPv4;
        s->addr = NULL;
        s->rx_port = rx_port;
        s->tx_port = tx_port;
        s->ttl = ttl;
        if (inet_pton(AF_INET, addr, &s->addr4) != 1) {
                struct hostent *h = gethostbyname(addr);
                if (h == NULL) {
                        socket_error("Can't resolve IP address for %s", addr);
                        free(s);
                        return NULL;
                }
                memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4));
        }
        if (iface != NULL) {
                if ((ifindex = if_nametoindex(iface)) == 0) {
                        debug_msg("Illegal interface specification\n");
                        free(s);
                        return NULL;
                }
        } else {
                ifindex = 0;
        }
        s->fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (s->fd < 0) {
                socket_error("Unable to initialize socket");
                return NULL;
        }
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_SNDBUF, (char *)&udpbufsize,
             sizeof(udpbufsize)) != 0) {
                debug_msg("WARNING: Unable to increase UDP sendbuffer\n");
        }
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_RCVBUF, (char *)&udpbufsize,
             sizeof(udpbufsize)) != 0) {
                debug_msg("WARNING: Unable to increase UDP recvbuffer\n");
        }
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse,
             sizeof(reuse)) != 0) {
                socket_error("setsockopt SO_REUSEADDR");
                return NULL;
        }
#ifdef SO_REUSEPORT
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse,
             sizeof(reuse)) != 0) {
                socket_error("setsockopt SO_REUSEPORT");
                return NULL;
        }
#endif
        s_in.sin_family = AF_INET;
        s_in.sin_addr.s_addr = INADDR_ANY;
        s_in.sin_port = htons(rx_port);
        if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) {
                socket_error("bind");
                return NULL;
        }
        if (IN_MULTICAST(ntohl(s->addr4.s_addr))) {
                char loop = 1;
                struct ip_mreq imr;

                imr.imr_multiaddr.s_addr = s->addr4.s_addr;
                imr.imr_interface.s_addr = ifindex;

                if (SETSOCKOPT
                    (s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr,
                     sizeof(struct ip_mreq)) != 0) {
                        socket_error("setsockopt IP_ADD_MEMBERSHIP");
                        return NULL;
                }
#ifndef WIN32
                if (SETSOCKOPT
                    (s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop,
                     sizeof(loop)) != 0) {
                        socket_error("setsockopt IP_MULTICAST_LOOP");
                        return NULL;
                }
#endif
                if (SETSOCKOPT
                    (s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&s->ttl,
                     sizeof(s->ttl)) != 0) {
                        socket_error("setsockopt IP_MULTICAST_TTL");
                        return NULL;
                }
                if (SETSOCKOPT
                    (s->fd, IPPROTO_IP, IP_MULTICAST_IF,
                     (char *)&ifindex, sizeof(ifindex)) != 0) {
                        socket_error("setsockopt IP_MULTICAST_IF");
                        return NULL;
                }
        }
        s->addr = strdup(addr);
        return s;
}
Пример #8
0
static socket_udp *udp_init4(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl)
{
	int                 	 reuse = 1;
	struct sockaddr_in  	 s_in;
	int recv_buf_size;
	int test_buffer;
	int test_buffer_size=sizeof(test_buffer);

	socket_udp         	*s = (socket_udp *)malloc(sizeof(socket_udp));
	s->mode    = IPv4;
	s->addr    = NULL;
	s->rx_port = rx_port;
	s->tx_port = tx_port;
	s->ttl     = ttl;
	if (inet_pton(AF_INET, addr, &s->addr4) != 1) {
		struct hostent *h = gethostbyname(addr);
		if (h == NULL) {
			socket_error("Can't resolve IP address for %s", addr);
                        free(s);
			return NULL;
		}
		memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4));
	}
	if (iface != NULL) {
		if (inet_pton(AF_INET, iface, &s->iface4_addr) != 1) {
			rtp_message(LOG_ERR, "Illegal interface specification");
                        free(s);
			return NULL;
		}
	} else {
		s->iface4_addr.s_addr = 0;
	}
	s->fd = socket(AF_INET, SOCK_DGRAM, 0);
	if (s->fd < 0) {
		socket_error("socket");
		free(s);
		return NULL;
	}
	if (have_recv_buf_size != 0) {
	  recv_buf_size = recv_buf_size_value;
	  if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_RCVBUF, (char *)&recv_buf_size, sizeof(int)) != 0) {
	    socket_error("setsockopt SO_RCVBUF");
	    close(s->fd);
	    free(s);
	    return NULL;
	  }

        //Since setsockopt would not return the error if /proc/sys/net/core/rmem_max is smaller
        //then the value you are trying to set. use sysctl -w net.core.rmem_max=new_val
        //to set the value higher than what is desired in RCVBUF
	  if( getsockopt( s->fd, SOL_SOCKET, SO_RCVBUF, (void*)&test_buffer, &test_buffer_size ) == -1 )
	    {
	      socket_error("getsockopt SO_RCVBUF");
	    } else {
	      //See if we could set the desired value
	      if(test_buffer < recv_buf_size) {
		rtp_message(LOG_WARNING, "Failed to set the RCVBUF to %d, only could set %d\n. Check the Max kernel receive buffer size using \"sysctl net.core.rmem_max\"\n", recv_buf_size, test_buffer);
	      }
	    }
	}
	
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) {
		socket_error("setsockopt SO_REUSEADDR");
		close(s->fd);
		free(s);
		return NULL;
	}
#ifdef SO_REUSEPORT
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) {
	  close(s->fd);
	  free(s);
		socket_error("setsockopt SO_REUSEPORT");
		return NULL;
	}
#endif
	s_in.sin_family      = AF_INET;
	s_in.sin_addr.s_addr = INADDR_ANY;
	s_in.sin_port        = htons(rx_port);
	if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) {
		socket_error("bind: port %d", rx_port);
		close(s->fd);
		free(s);
		return NULL;
	}
	if (IN_MULTICAST(ntohl(s->addr4.s_addr))) {
		char            loop = 1;
#ifndef HAVE_IGMP_V3
		struct ip_mreq  imr;
		imr.imr_multiaddr.s_addr = s->addr4.s_addr;
		imr.imr_interface.s_addr = s->iface4_addr.s_addr;

		if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &imr, sizeof(struct ip_mreq)) != 0) {
			socket_error("setsockopt IP_ADD_MEMBERSHIP");
			close(s->fd);
			free(s);
			return NULL;
		}
#else 
		rtp_message(LOG_DEBUG,"IGMPV3 src:%s\n", G_Multicast_Src);
             /* Join Multicast group with source filter */
		if (G_IGMP_V3 != 0 &&
		    strcmp(G_Multicast_Src, "0.0.0.0") != 0) {
             struct ip_mreq_source imr;
	     imr.imr_multiaddr.s_addr = s->addr4.s_addr;
	     imr.imr_interface.s_addr = s->iface4_addr.s_addr;
             if (inet_aton(G_Multicast_Src, &imr.imr_sourceaddr) == 0) {
                rtp_message(LOG_ERR, "inet_aton failed for %s\n",
                        G_Multicast_Src);
                return NULL;
              }

             if( setsockopt( s->fd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
                         (char*)&imr,
                         sizeof(struct ip_mreq_source) ) == -1 )
             {
		socket_error("setsockopt IP_ADD_SOURCE_MEMBERSHIP");
		close(s->fd);
		free(s);
		return NULL;
             }
		}
#endif
        
#ifndef WIN32
		if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) {
			socket_error("setsockopt IP_MULTICAST_LOOP");
	  close(s->fd);
	  free(s);
			return NULL;
		}
#endif
		if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &s->ttl, sizeof(s->ttl)) != 0) {
			socket_error("setsockopt IP_MULTICAST_TTL");
			close(s->fd);
			free(s);
			return NULL;
		}
		if (s->iface4_addr.s_addr != 0) {
			if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_IF, (char *) &s->iface4_addr, sizeof(s->iface4_addr)) != 0) {
			  close(s->fd);
			  free(s);
				socket_error("setsockopt IP_MULTICAST_IF");
				return NULL;
			}
		}
	}
        s->addr = strdup(addr);
	return s;
}
void Sockethelper::setreuse()
{
	int op = 1;
	if (!setsockopt(SOL_SOCKET, SO_REUSEADDR, &op, sizeof(op)))
		throw socket_error("setreuse");
}
void Sockethelper::setrcvbuf(int size)
{
	if (!setsockopt(SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)))
		throw socket_error("setrcvbuf");
}
void Sockethelper::setnodelay()
{
	int op = 1;
	if (!setsockopt(IPPROTO_TCP, TCP_NODELAY, &op, sizeof(op)))
		throw socket_error("setnodelay");
}
void Sockethelper::listen()
{
	if (SOCKET_ERROR == ::listen(getsocket(), SOMAXCONN))
		throw socket_error("listen");
	m_sock_flags.tcpserver = 1;
}
Пример #13
0
static socket_udp *udp_init6(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl)
{
#ifdef HAVE_IPv6
	int                 reuse = 1;
	struct sockaddr_in6 s_in;
	socket_udp         *s = (socket_udp *) malloc(sizeof(socket_udp));
	s->mode    = IPv6;
	s->addr    = NULL;
	s->rx_port = rx_port;
	s->tx_port = tx_port;
	s->ttl     = ttl;
	
	if (iface != NULL) {
		debug_msg("Not yet implemented\n");
		abort();
	}

	if (inet_pton(AF_INET6, addr, &s->addr6) != 1) {
		/* We should probably try to do a DNS lookup on the name */
		/* here, but I'm trying to get the basics going first... */
		debug_msg("IPv6 address conversion failed\n");
                free(s);
		return NULL;	
	}
	s->fd = socket(AF_INET6, SOCK_DGRAM, 0);
	if (s->fd < 0) {
		socket_error("socket");
		return NULL;
	}
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) {
		socket_error("setsockopt SO_REUSEADDR");
		return NULL;
	}
#ifdef SO_REUSEPORT
	if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) {
		socket_error("setsockopt SO_REUSEPORT");
		return NULL;
	}
#endif
	
	memset((char *)&s_in, 0, sizeof(s_in));
	s_in.sin6_family = AF_INET6;
	s_in.sin6_port   = htons(rx_port);
#ifdef HAVE_SIN6_LEN
	s_in.sin6_len    = sizeof(s_in);
#endif
	s_in.sin6_addr = in6addr_any;
	if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) {
		socket_error("bind");
		return NULL;
	}
	
	if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) {
		unsigned int      loop = 1;
		struct ipv6_mreq  imr;
#ifdef MUSICA_IPV6
		imr.i6mr_interface = 1;
		imr.i6mr_multiaddr = s->addr6;
#else
		imr.ipv6mr_multiaddr = s->addr6;
		imr.ipv6mr_interface = 0;
#endif
		
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *) &imr, sizeof(imr)) != 0) {
			socket_error("setsockopt IPV6_ADD_MEMBERSHIP");
			return NULL;
		}
		
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *) &loop, sizeof(loop)) != 0) {
			socket_error("setsockopt IPV6_MULTICAST_LOOP");
			return NULL;
		}
		if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *) &ttl, sizeof(ttl)) != 0) {
			socket_error("setsockopt IPV6_MULTICAST_HOPS");
			return NULL;
		}
	}

	assert(s != NULL);

        s->addr = strdup(addr);
	return s;
#else
	UNUSED(addr);
	UNUSED(iface);
	UNUSED(rx_port);
	UNUSED(tx_port);
	UNUSED(ttl);
	return NULL;
#endif
}
Пример #14
0
QDeclarativeBluetoothSocket::QDeclarativeBluetoothSocket(QBluetoothSocket *socket, QDeclarativeBluetoothService *service, QObject *parent)
    : QObject(parent)
{
    d = new QDeclarativeBluetoothSocketPrivate(this);
    d->m_service = service;
    d->m_socket = socket;
    d->m_connected = true;
    d->m_componentCompleted = true;

    QObject::connect(socket, SIGNAL(connected()), this, SLOT(socket_connected()));
    QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected()));
    QObject::connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socket_error(QBluetoothSocket::SocketError)));
    QObject::connect(socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), this, SLOT(socket_state(QBluetoothSocket::SocketState)));
    QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socket_readyRead()));

    d->m_stream = new QDataStream(socket);

}
Пример #15
0
static socket_udp *udp_init6(const char *addr, const char *iface,
                             uint16_t rx_port, uint16_t tx_port, int ttl)
{
#ifdef HAVE_IPv6
        int reuse = 1;
        struct sockaddr_in6 s_in;
        socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp));
        s->mode = IPv6;
        s->addr = NULL;
        s->rx_port = rx_port;
        s->tx_port = tx_port;
        s->ttl = ttl;
        struct addrinfo hints, *res0;
        unsigned int ifindex;
        int err;

        if (iface != NULL) {
                if ((ifindex = if_nametoindex(iface)) == 0) {
                        debug_msg("Illegal interface specification\n");
                        free(s);
                        return NULL;
                }
        } else {
                ifindex = 0;
        }

        memset(&hints, 0, sizeof(hints));
        hints.ai_family = AF_INET6;
        hints.ai_socktype = SOCK_DGRAM;

        char tx_port_str[7];
        sprintf(tx_port_str, "%u", tx_port);
        if ((err = getaddrinfo(addr, tx_port_str, &hints, &res0)) != 0) {
                /* We should probably try to do a DNS lookup on the name */
                /* here, but I'm trying to get the basics going first... */
                debug_msg("IPv6 address conversion failed: %s\n", gai_strerror(err));
                free(s);
                return NULL;
        } else {
                memcpy(&s->sock6, res0->ai_addr, res0->ai_addrlen);
                memcpy(&s->addr6, &((struct sockaddr_in6 *) res0->ai_addr)->sin6_addr,
                                sizeof(((struct sockaddr_in6 *) res0->ai_addr)->sin6_addr));
        }
        freeaddrinfo(res0);

        s->fd = socket(AF_INET6, SOCK_DGRAM, 0);
        if (s->fd < 0) {
                socket_error("socket");
                return NULL;
        }
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse,
             sizeof(reuse)) != 0) {
                socket_error("setsockopt SO_REUSEADDR");
                return NULL;
        }
#ifdef SO_REUSEPORT
        if (SETSOCKOPT
            (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse,
             sizeof(reuse)) != 0) {
                socket_error("setsockopt SO_REUSEPORT");
                return NULL;
        }
#endif

        memset((char *)&s_in, 0, sizeof(s_in));
        s_in.sin6_family = AF_INET6;
        s_in.sin6_port = htons(rx_port);
#ifdef HAVE_SIN6_LEN
        s_in.sin6_len = sizeof(s_in);
#endif
        s_in.sin6_addr = in6addr_any;
        if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) {
                socket_error("bind");
                return NULL;
        }

        if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) {
                unsigned int loop = 1;
                struct ipv6_mreq imr;
#ifdef MUSICA_IPV6
                imr.i6mr_interface = 1;
                imr.i6mr_multiaddr = s->addr6;
#else
                imr.ipv6mr_multiaddr = s->addr6;
                imr.ipv6mr_interface = ifindex;
#endif

                if (SETSOCKOPT
                    (s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&imr,
                     sizeof(struct ipv6_mreq)) != 0) {
                        socket_error("setsockopt IPV6_ADD_MEMBERSHIP");
                        return NULL;
                }

                if (SETSOCKOPT
                    (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&loop,
                     sizeof(loop)) != 0) {
                        socket_error("setsockopt IPV6_MULTICAST_LOOP");
                        return NULL;
                }
                if (SETSOCKOPT
                    (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl,
                     sizeof(ttl)) != 0) {
                        socket_error("setsockopt IPV6_MULTICAST_HOPS");
                        return NULL;
                }
                if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                                        (char *)&ifindex, sizeof(ifindex)) != 0) {
                        socket_error("setsockopt IPV6_MULTICAST_IF");
                        return NULL;
                }
        }

        assert(s != NULL);

        s->addr = strdup(addr);
        return s;
#else
        UNUSED(addr);
        UNUSED(iface);
        UNUSED(rx_port);
        UNUSED(tx_port);
        UNUSED(ttl);
        return NULL;
#endif
}
Пример #16
0
void QDeclarativeBluetoothSocket::newSocket(QBluetoothSocket *socket, QDeclarativeBluetoothService *service)
{
    if(d->m_socket){
        delete d->m_socket;
    }

    d->m_service = service;
    d->m_socket = socket;
    d->m_connected = true;
    d->m_componentCompleted = true;
    d->m_error = QLatin1String("No Error");

    QObject::connect(socket, SIGNAL(connected()), this, SLOT(socket_connected()));
    QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected()));
    QObject::connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socket_error(QBluetoothSocket::SocketError)));
    QObject::connect(socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), this, SLOT(socket_state(QBluetoothSocket::SocketState)));
    QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socket_readyRead()));

    d->m_stream = new QDataStream(socket);

    socket_state(socket->state());

    emit connectedChanged();
}
Пример #17
0
void
f_socket_error (void)
{
    put_constant_string(socket_error(sp->u.number));
}