Exemplo n.º 1
0
/* prints a info about socket in the form sourceIP:sourcePort:destinationIP:destinationPort*/ 
void pair_info(passive_sock, sock, port){
	char return_str[46];
	memset(return_str,0,sizeof(return_str));
	/* Side is currently passive */
	if (passive_sock != -1){ 
		/*if side has accepted a connection */ 
		if (sock != -1)
			strcat(return_str,peer_info(sock));
		else
			strcat(return_str,"-:-");	
		strcat(return_str,":");
		strcat(return_str,my_info(passive_sock,port));
		strcat(return_str, "\n");}
	/*Side is active connection */
	else if (sock != -1){
		strcat(return_str,my_info(sock,port));
		strcat(return_str,":");
		strcat(return_str,peer_info(sock));
		strcat(return_str,"\n");}
	else
		strcat(return_str,"-:-:-:-\n");
	wAddstr(IO,return_str);
}
void operator()(jvb::environment e, jvb::Object obj
                BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_ITERATION(), A, a)) const
{
  assert(obj.raw() != 0);
  BOOST_MPL_ASSERT((boost::mpl::bool_<(sizeof(void*) <= sizeof(::jlong))>));
  // typename Allocator::template rebind<T>::other allocator;
  std::cout << "constructor wrapper" << std::endl;
  // void* p = allocator.allocate(1, 0);
  // T* object = new (p) T;

  binding::virtual_table<N>const* vtable;
  ::jclass c = obj.class_(e).raw();
  {
    const char* d = "J";
    assert(c != 0);
    jfieldID fid = e.raw()->GetStaticFieldID
      (c, javabind_vtable_field_name, d);
    assert(fid != 0);
    jlong rl = e.raw()->GetStaticLongField(c, fid);
    void* p = 0;
    std::memcpy(&p, &rl, sizeof(void*));
    vtable = static_cast<binding::virtual_table<N>*>(p);
  }
  void* fp = vtable->methods[I].function_object.get();
  assert(fp != 0);
  boost::function<Result(jvb::environment BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), A))>*
    f = static_cast<boost::function<Result(jvb::environment
                                           BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), A))>*>(fp);

  std::auto_ptr<binding::peer_info<T, N> >
    peer_info(new binding::peer_info<T, N>
              (*vtable, (*f)(e BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), a)) ));

  {
    ::jlong rl = 0;
    void* p = peer_info.release();
    std::memcpy(&rl, &p, sizeof(void*));
    const char* d = "J";
    assert(c != 0);
    jfieldID fid = e.raw()->GetFieldID
      (c, binding::javabind_peer_info_field_name, d);
    assert(fid != 0);
    e.raw()->SetLongField(obj.raw(), fid, rl);
  }
}
Exemplo n.º 3
0
RTP *rtp_accept(RTP *server)
{
RTP *rtp;
struct sockaddr_in cli_addr;
int client, len = sizeof(cli_addr);
static CHAR *fid = "rtp_accept";
 
/* Create/fill the handle */
 
    if ((rtp = (RTP *) malloc(sizeof(RTP))) == (RTP *) NULL) {
        rtp_log(RTP_ERR, "%s: malloc: %s", fid, strerror(errno));
        return (RTP *) NULL;
    }

    rtp->sd   = server->sd;
    rtp->port = server->port;
    rtp->attr = server->attr;
    rtp->soh.sh_tstamp = -1;
    rtp->soh.sh_nslot  = RTP_DEFNSLOT;
    rtp->soh.sh_ndas   = 0;
    rtp->soh.sh_index  = -1;
    rtp->soh.sh_stat   = (struct rtp_stat *)
                         malloc(sizeof(struct rtp_stat)*rtp->soh.sh_nslot);
    if (rtp->soh.sh_stat == (struct rtp_stat *) NULL) {
        rtp_log(RTP_ERR, "%s: malloc: %s", fid, strerror(errno));
        free(rtp);
        return (RTP *) NULL;
    }

/* Accept a new connection */

    client = INVALID_SOCKET;
    while (client == INVALID_SOCKET) {
        client = accept(server->sd, (struct sockaddr *) &cli_addr, &len);
        if (client == INVALID_SOCKET && errno != EINTR) {
            rtp_log(RTP_ERR, "%s: accept: %s", fid, strerror(errno));
            free(rtp->soh.sh_stat);
            free(rtp);
            return (RTP *) NULL;
        }
    }

/* Complete the handle */

    rtp->sd = client;
    MUTEX_INIT(&rtp->rcv.mutex);
    MUTEX_INIT(&rtp->snd.mutex);
    if (!peer_info(rtp)) {
        rtp_log(RTP_DEBUG, "%s: peer_info failed", fid);
        free(rtp->soh.sh_stat);
        free(rtp);
        return (RTP *) NULL;
    }

/* Windows NT defaults non-blocking */

#ifndef WINNT
    if (fcntl(rtp->sd, F_SETFL, O_NONBLOCK) == -1) {
        rtp_log(RTP_ERR, "%s: fcntl: %s", fid, strerror(errno));
        free(rtp->soh.sh_stat);
        free(rtp);
        return (RTP *) NULL;
    }
#endif
    rtp_log(RTP_DEBUG, "%s: incoming connection from %s:%hu",
        fid, rtp->peer, rtp->port
    );

/* Do the handshake */

    if (!handshake(rtp)) {
        rtp_log(RTP_ERR, "%s: handshake failed", fid);
        free(rtp->soh.sh_stat);
        free(rtp);
        return (RTP *) NULL;
    }

/* Return handle for this connection */

    return rtp;
}