基于UDP高性能传输协议UDT doc翻译(三)

原文转自: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暂时还没有多重连接功能,当有多个网卡时会出错。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值