原文转自:http://hi.baidu.com/doodlezone/item/42fe03cd5b06f53598b498c2
方法名
connect方法
功能
用于连接到服务端socket(常规)或者peer side(集合点模式)
详细接口
int connect(
UDTSOCKET u,
const struct sockaddr* name,
int* namelen
);
返回值
成功:返回0
错误:返回UDT::ERROR
描述
UDT是面向连接的。有两种模式:SOCK_STREA,和SOCK_DARAM模式,
name是需要建立连接的服务端或者peer side。
C/S模式下服务端要调用bind和listen,在rendezvous模式下,两端都要bind并同时连接。
UDT至少需要一个来回建立连接,这对于频繁建立连接又断开的应用是一个瓶颈。
当UDT_RCVSYN=false(接收不同步)connect会立即返回,并在后台运行建立连接,线程可以用epoll来等待连接完成。
当失败是sicket可以重连,失败的socket也要用close来关闭。
方法名
epoll方法
功能
用于有效地对大量的socket轮询IO事件
详细接口
#ifndef WIN32
typedef int SYSSOCKET;
#else
typedef SOCKET SYSSOCKET;
#endif
int epoll_create();
int epoll_add_usock(const int eid, const UDTSOCKET usock, const int* events = NULL);
int epoll_add_ssock(const int eid, const UDTSOCKET ssock, const int* events = NULL);
int epoll_remove_usock(const int eid, const UDTSOCKET usock, const int* events = NULL);
int epoll_remove_ssock(const int eid, const UDTSOCKET ssock, const int* events = NULL);
int epoll_wait(const int eid, std::set<UDTSOCKET>* readfds, std::set<UDTSOCKET>* writefds, int64_t msTimeOut, std::set<SYSSOCKET>* lrfds = NULL, std::set<SYSSOCKET>* wrfds = NULL);
int epoll_release(const int eid);
返回值
成功:epoll_create返回epoll ID,epoll_wait返回准备好IO的socket数量
其他三个函数返回0.
错误:返回UDT::ERROR
描述
当线程需等待很多socket时,应该用epoll代替select和selectEx来查询。
它也提供等待系统socket,这样应用就可以同时接受UDT和TCP/UDP。
线程可以用epoll_create去创建一个epoll ID用epoll_add_usock和epoll_remove_usock去添加和删除socket,如果已经存在,添加会被忽略。
添加无效的或者关闭的socket会引发错误。删除不存在的则不会错误(忽略)
在linux上,开发者可以用EPOLLIN(read)和EPOLLOUT(write)以及EPOLLERR(异常)来查看具体事件。可以创建多个epoll。
epoll_wait是一个timeout值
方法名
getlasterror方法
功能
用于获得一个线程最近一次的UDT错误
详细接口
ERRORINFO& getlasterror(
);
返回值
成功:返回0
错误:返回UDT::ERROR
描述
读出线程中最近一次的错误。
方法名
getpeername方法
功能
用于获得peer side的地址
详细接口
int getpeername(
UDTSOCKET u,
struct sockaddr* name,
int* namelen
);
返回值
成功:返回0,并将地址存储在name变量中。
错误:返回UDT::ERROR
描述
前提是:UDT socket已经建立了连接。
方法名
getsockname方法
功能
用于获得相关DUT的本地地址
详细接口
int getsockname(
UDTSOCKET u,
struct sockaddr* name,
int* namelen
);
返回值
成功:返回0,并将地址存储在name变量中。
错误:返回UDT::ERROR
描述
调用该方法前,UDT socket必须明确地绑定了或隐式地连接了。
如果该调用在bind之后且在connect之前,IP地址会返回用于绑定的地址,如果在连接之后,返回的是peer side看到的地址。
例如:
有一个代理地址,连接后,将返回代理IP地址,不是本地地址,但不管哪种情况,返回的端口号是一样的。
因为UDP是无连接的,用此调用返回0.0.0.0作为IP地址,而UDT是面向连接的,UDT会返回一个有效的IP地址(如果没有代理)。
UDT暂时还没有多重连接功能,当有多个网卡时会出错。