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; }
/* 销毁连接器 * 通过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; }
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); }
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; }
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; }
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; }
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; }