Beispiel #1
0
static PRStatus _udt_close(PRFileDesc *fd) {
    PRUdtSocketDesc* desc = (PRUdtSocketDesc*)(fd->secret);
    udt_close(desc->udtfd);
    PR_Close(desc->sock_pair0);
    PR_Close(desc->sock_pair1);
	return PR_SUCCESS;
}
Beispiel #2
0
/* 销毁连接器
 * 通过ne_object_destroy调用此函数
 */
NEINT32 _connector_destroy(ne_handle net_handle, NEINT32 force) 
{
	ne_assert(net_handle) ;
	//ne_msgtable_destroy(net_handle) ;
	if(net_handle->nodetype==NE_TCP){
		struct ne_tcp_node *socket_addr = (struct ne_tcp_node*)net_handle ;
		
		ne_tcpnode_close(socket_addr,force);
		ne_msgtable_destroy(net_handle) ;
		ne_tcpnode_deinit((struct ne_tcp_node*)net_handle) ;
		return 0 ;
	}
	else if(net_handle->nodetype==NE_UDT) {
		ne_udt_node *socket_addr = (ne_udt_node*)net_handle ;
		
		if(socket_addr->listen_fd>0) {
			udt_close(socket_addr,force);
		}
		
		ne_msgtable_destroy(net_handle) ;
		_deinit_udt_socket(socket_addr) ;		//client socket need send lock
		return 0;
	}
	return -1;
}
Beispiel #3
0
static void _udtp_detor(PRFileDesc *fd) {
    PRUdtSocketDesc desc = *(PRUdtSocketDesc*)fd->secret;
    PR_Free(fd->secret);
    PR_Close(desc.sock_pair0);
    PR_Close(desc.sock_pair1);
    udt_close(desc.udtfd);
    desc.dtor(fd);
}
Beispiel #4
0
PRFileDesc* PR_OpenUDPTransportSocket(PRIntn af, const char* host,
        PRInt32 port) {
    _check_init();
    PRFileDesc* socks[2] = {0};
    UDTSOCKET u_socket = UDT_UDT_SNDBUF;
    PRUdtSocketDesc* p_desc = NULL;

    u_socket = udt_socket(af, SOCK_STREAM, 0);
    PRStatus status_pr = PR_NewTCPSocketPair(socks);

    PRFileDesc* udpt_fd = PR_CreateIOLayerStub(_udpt_desc_identity,
            &udptMethods);

    p_desc = (PRUdtSocketDesc*)PR_Malloc(sizeof(PRUdtSocketDesc));
    int status_udt = udt_bind_events(u_socket, UDT_UDT_EPOLL_IN, (void*)_udp_event_cb, p_desc);

    if ((NULL != udpt_fd) && (NULL != p_desc) && (status_udt >= 0)
    		&& (status_pr == PR_SUCCESS))
    {
        PRFileDesc * sockpair_fd = socks[0];
        memset(p_desc, 0, sizeof(PRUdtSocketDesc));
    	p_desc->sock_pair0 = socks[0];
    	p_desc->sock_pair1 = socks[1];
    	p_desc->dtor       = udpt_fd->dtor;
    	p_desc->udtfd      = u_socket;
        udpt_fd->secret = (PRFilePrivate*)p_desc;
        udpt_fd->lower = sockpair_fd;
        sockpair_fd->higher = udpt_fd;
        udpt_fd->dtor = _udtp_detor;
        return udpt_fd;
    }

    if (NULL != socks[0])
        PR_Close(socks[0]);
    if (NULL != socks[1])
        PR_Close(socks[1]);
    if (UDT_INVALID_SOCK != u_socket)
        udt_close(u_socket);
    if (NULL != p_desc)
        PR_Free(p_desc);
    if (NULL != udpt_fd)
        PR_Close(udpt_fd);

    return NULL;
}
Beispiel #5
0
NEINT32 ne_connector_close(ne_netui_handle net_handle, NEINT32 flag)
{	
	//struct net_handle_header *h_header =(struct net_handle_header *)net_handle ;
	ne_assert(net_handle) ;
	//ne_msgtable_destroy(net_handle) ;
	if(net_handle->nodetype==NE_TCP){

		ne_tcpnode_close((struct ne_tcp_node*)net_handle,flag);
		
		ne_tcpnode_sendlock_deinit((struct ne_tcp_node*)net_handle) ;
		return 0 ;
	}
	else if(net_handle->nodetype==NE_UDT) {
		ne_udt_node *socket_addr = (ne_udt_node*)net_handle ;
		
		if(socket_addr->listen_fd>0) {
			udt_close(socket_addr,flag);
			udt_release_sendlock(socket_addr) ;		//client socket need send lock
		}
		return 0;
	}
	return -1;
}
Beispiel #6
0
int main(int argc, char* argv[])
{
    if ((3 != argc) || (0 == atoi(argv[2])))
    {
        printf("usage: client server_ip server_port\n");
        return -1;
    }
   
   
    if (udt_startup() != 0)
    {
        printf("udt : startup failed:%s\n", udt_getlasterror_desc());
        return -1;
    }
   
   
    struct addrinfo hints, *local, *peer;

   
    memset(&hints, 0, sizeof(struct addrinfo));

   
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    //hints.ai_socktype = SOCK_DGRAM;
   
    if (0 != getaddrinfo(NULL, argv[2], &hints, &local))
    {
        printf("incorrect network address.\n");
        return -1;
    }

    
    UDTSOCKET client = udt_socket(local->ai_family, local->ai_socktype, local->ai_protocol);

   // UDT Options
   //UDT::setsockopt(client, 0, UDT_CC, new CCCFactory<CUDPBlast>, sizeof(CCCFactory<CUDPBlast>));
   //UDT::setsockopt(client, 0, UDT_MSS, new int(9000), sizeof(int));
   //UDT::setsockopt(client, 0, UDT_SNDBUF, new int(10000000), sizeof(int));
   //UDT::setsockopt(client, 0, UDP_SNDBUF, new int(10000000), sizeof(int));
   //UDT::setsockopt(client, 0, UDT_MAXBW, new int64_t(12500000), sizeof(int));

   // for rendezvous connection, enable the code below
   /*
   UDT::setsockopt(client, 0, UDT_RENDEZVOUS, new bool(true), sizeof(bool));
   if (UDT::ERROR == UDT::bind(client, local->ai_addr, local->ai_addrlen))
   {
      cout << "bind: " << UDT::getlasterror().getErrorMessage() << endl;
      return 0;
   }
   */


    freeaddrinfo(local);
   
    if (0 != getaddrinfo(argv[1], argv[2], &hints, &peer))
    {
        printf("incorrect server/peer address. %s:%s\n", argv[1], argv[2]);
        return -1;
   
    }

   
    // connect to the server, implict bind
    if (UDT_ERROR == udt_connect(client, peer->ai_addr, peer->ai_addrlen))
    {
        printf("connect: %s\n", udt_getlasterror_desc());
        return 0;
    }

 
    freeaddrinfo(peer);
   
    // using CC method
    //CUDPBlast* cchandle = NULL;
    //int temp;
   
    //UDT::getsockopt(client, 0, UDT_CC, &cchandle, &temp);
   
    //if (NULL != cchandle)
    //   cchandle->setRate(500);
    
    char* data = malloc(sizeof(char) * DATA_LEN);
    memset(data, 'a', DATA_LEN);

    struct timeval t1, t2;
    gettimeofday(&t1, NULL);
    for (int i = 0; i < N_SEND; i ++)
    {
        //printf("i = %d\n", i);
        if (UDT_ERROR == udt_send(client, data, DATA_LEN, 0))
        {
            printf("send:%s\n", udt_getlasterror_desc());
            break;
        }
    }

    gettimeofday(&t2, NULL);
    int elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
    elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
    printf("finished to write data in %d milliseconds\n", elapsedTime);
    
    udt_close(client);
    free(data);

    if (udt_cleanup() != 0) {
        printf("cleanup:%s", udt_getlasterror_desc());
    }
    return 0;
}
Beispiel #7
0
static PRStatus _udt_close(PRFileDesc *fd) {
	///fprintf(stdout, "%s:%d\n", __func__, __LINE__);
	UDTSOCKET s = get_socket_from_fd(fd);
	udt_close(s);
	return PR_SUCCESS;
}