青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

aurain
技術(shù)文摘
posts - 137,  comments - 268,  trackbacks - 0

UDT是建立在UDP協(xié)議基礎(chǔ)之上的應(yīng)用層協(xié)議,其最終是通過UDP協(xié)議來接發(fā)數(shù)據(jù)。

UDT的實(shí)現(xiàn)中,是通過類CChannel來處理的,顧名思義,可以理解為通過UDP管道來接發(fā)數(shù)據(jù)。

       來看看CChannel提供的主要方法:

void setSndBufSize(const int& size);

void setRcvBufSize(const int& size);

void open(const sockaddr* addr = NULL);

int sendto(const sockaddr* addr, CPacket& packet) const;

int recvfrom(sockaddr* addr, CPacket& packet) const;

注:CPacketUDP包結(jié)構(gòu)(數(shù)據(jù)包與控制包)

 

#ifndef WIN32

  int m_iSocket;                    // socket descriptor

#else

  SOCKET m_iSocket;

#endif

int m_iSndBufSize;                   // UDP sending buffer size

int m_iRcvBufSize;                   // UDP receiving buffer size

 

setSndBufSizesetRcvBufSize分別設(shè)置發(fā)送和接收緩沖區(qū)大小,即對(duì)m_iSndBufSizem_iRcvBufSize賦值,主要看看open函數(shù):

void CChannel::open(const sockaddr* addr)

{

   // construct an socket

   m_iSocket = socket(m_iIPversion, SOCK_DGRAM, 0);

   if (NULL != addr)

   {

      socklen_t namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) :sizeof(sockaddr_in6);

      if (0 != bind(m_iSocket, addr, namelen))

         //error

   }

   else

   {

      //sendto or WSASendTo will also automatically bind the socket

      addrinfo hints;

      addrinfo* res;

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

      hints.ai_flags = AI_PASSIVE;

      hints.ai_family = m_iIPversion;

      hints.ai_socktype = SOCK_DGRAM;

      if (0 != getaddrinfo(NULL, "0", &hints, &res))

        //error

      if (0 != bind(m_iSocket, res->ai_addr, res->ai_addrlen))

        //error

      freeaddrinfo(res);

   }

   setUDPSockOpt();    //調(diào)用TCP/IP協(xié)議棧提供的方法設(shè)置UDP選項(xiàng)(緩沖區(qū)大小)

}

void CChannel::setUDPSockOpt()

{

   if ((0 != setsockopt(m_iSocket, SOL_SOCKET, SO_RCVBUF, (char *)&m_iRcvBufSize, sizeof(int))) ||(0 != setsockopt(m_iSocket, SOL_SOCKET, SO_SNDBUF, (char *)&m_iSndBufSize,sizeof(int))))

      //error

 

   #ifdef WIN32

      DWORD ot = 1; //milliseconds

      if (setsockopt(m_iSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&ot, sizeof(DWORD)) < 0)

         throw CUDTException(1, 3, NET_ERROR);

   #else

      // Set receiving time-out value

      if (setsockopt(m_iSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(timeval)) < 0)

         throw CUDTException(1, 3, NET_ERROR);

   #endif

}

 

下面看看sendto函數(shù),該函數(shù)是把CPacket內(nèi)容通過udp發(fā)送出去,分linux系與win32兩種情況。

int CChannel::sendto(const sockaddr* addr, CPacket& packet) const

{

   // 主機(jī)序到網(wǎng)絡(luò)序

   if (packet.getFlag())//如果是控制包

      for (int i = 0, n = packet.getLength() / 4; i < n; ++ i)

         *((uint32_t *)packet.m_pcData + i) = htonl(*((uint32_t *)packet.m_pcData + i));

 

   // convert packet header into network order(包頭序也需要轉(zhuǎn)換)

   for (int j = 0; j < 4; ++ j)

      packet.m_nHeader[j] = htonl(packet.m_nHeader[j]);

 

   #ifndef WIN32

      msghdr mh;

      mh.msg_name = (sockaddr*)addr;

      mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);

      mh.msg_iov = (iovec*)packet.m_PacketVector;

      mh.msg_iovlen = 2;

      mh.msg_control = NULL;

      mh.msg_controllen = 0;

      mh.msg_flags = 0;

 

      int res = sendmsg(m_iSocket, &mh, 0);    //調(diào)用協(xié)議棧函數(shù)發(fā)送出去

   #else

      DWORD size = CPacket::m_iPktHdrSize + packet.getLength();

      int addrsize = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);

      int res = WSASendTo(m_iSocket, (LPWSABUF)packet.m_PacketVector, 2, &size, 0, addr, addrsize, NULL, NULL);

      res = (0 == res) ? size : -1;

   #endif

 

   // 恢復(fù)序

   for (int k = 0; k < 4; ++ k)

      packet.m_nHeader[k] = ntohl(packet.m_nHeader[k]);

 

   if (packet.getFlag())

      for (int l = 0, n = packet.getLength() / 4; l < n; ++ l)

         *((uint32_t *)packet.m_pcData + l) = ntohl(*((uint32_t *)packet.m_pcData + l));

 

   return res;

}

 

recvfrom的原理也類似與sendto

int CChannel::recvfrom(sockaddr* addr, CPacket& packet) const

{

   #ifndef WIN32

      msghdr mh;  

      mh.msg_name = addr;

      mh.msg_namelen = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);

      mh.msg_iov = packet.m_PacketVector;

      mh.msg_iovlen = 2;

      mh.msg_control = NULL;

      mh.msg_controllen = 0;

      mh.msg_flags = 0;

 

      #ifdef UNIX

         fd_set set;

         timeval tv;

         FD_ZERO(&set);

         FD_SET(m_iSocket, &set);

         tv.tv_sec = 0;

         tv.tv_usec = 10000;

         select(m_iSocket+1, &set, NULL, &set, &tv);

      #endif

 

      int res = recvmsg(m_iSocket, &mh, 0);

   #else

      DWORD size = CPacket::m_iPktHdrSize + packet.getLength();

      DWORD flag = 0;

      int addrsize = (AF_INET == m_iIPversion) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);

 

      int res = WSARecvFrom(m_iSocket, (LPWSABUF)packet.m_PacketVector, 2, &size, &flag, addr, &addrsize, NULL, NULL);

      res = (0 == res) ? size : -1;

   #endif

 

   if (res <= 0)

   {

      packet.setLength(-1);

      return -1;

   }

 

   packet.setLength(res - CPacket::m_iPktHdrSize);

 

   // convert back into local host order

   for (int i = 0; i < 4; ++ i)

      packet.m_nHeader[i] = ntohl(packet.m_nHeader[i]);

 

   if (packet.getFlag())

      for (int j = 0, n = packet.getLength() / 4; j < n; ++ j)

         *((uint32_t *)packet.m_pcData + j) = ntohl(*((uint32_t *)packet.m_pcData + j));

 

   return packet.getLength();

}

posted on 2008-11-26 11:42 閱讀(4953) 評(píng)論(3)  編輯 收藏 引用 所屬分類: udt分析

FeedBack:
# re: UDT接發(fā)數(shù)據(jù)
2009-08-13 21:17 | azure
問一下哈.不知道udt能否改裝成想udp那樣可以使用同一個(gè)端口進(jìn)行多個(gè)客戶端連接,也就是假若實(shí)現(xiàn)p2p的話該如何操作  回復(fù)  更多評(píng)論
  
# re: UDT接發(fā)數(shù)據(jù)
2009-08-15 20:08 | oldseven
@azure
我也正想問這個(gè)問題,我覺的還是到 UDT的SourceForget網(wǎng)站上去問吧。  回復(fù)  更多評(píng)論
  
# re: UDT接發(fā)數(shù)據(jù)
2009-08-17 09:44 |
@azure
@oldseven
~~,這個(gè)UDT我也好長一段時(shí)間沒弄過了,官網(wǎng)應(yīng)該有清楚的解答  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2012年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網(wǎng)絡(luò)開發(fā)

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 501927
  • 排名 - 37

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人情趣视频| 亚洲高清色综合| 久久精品国产免费观看| 一区二区电影免费观看| 99国产精品久久久久久久| 最新国产成人在线观看| 欧美 日韩 国产在线| 能在线观看的日韩av| 欧美激情精品久久久久久变态| 欧美成人日韩| 亚洲日本中文字幕| 亚洲私人黄色宅男| 久久精品成人一区二区三区蜜臀| 久久亚洲精选| 欧美日韩国产精品一区二区亚洲| 欧美天天综合网| 国产一区二区三区在线观看精品 | 亚洲欧美国产va在线影院| 欧美亚洲三级| 麻豆精品精华液| 亚洲最新在线视频| 久久人91精品久久久久久不卡 | 欧美日韩xxxxx| 欧美手机在线| 欧美午夜精品一区| 欧美色图一区二区三区| 国产精品区一区二区三区| 狠狠综合久久av一区二区小说 | 亚洲卡通欧美制服中文| 欧美亚洲在线| 亚洲成色www8888| 99在线精品视频在线观看| 欧美在线观看视频一区二区| 久久精品中文字幕一区| 在线视频免费在线观看一区二区| 午夜精品一区二区三区四区| 久热精品视频在线观看| 女生裸体视频一区二区三区| 欧美三级在线视频| 国产综合色产| 99这里只有久久精品视频| 亚洲欧美第一页| 欧美国产亚洲视频| 亚洲欧美日韩精品综合在线观看| 久久在线免费视频| 国产精品色婷婷| 亚洲三级免费| 欧美在线视频一区二区三区| 亚洲欧洲精品一区二区三区| 午夜精品久久久久久久蜜桃app | 亚洲娇小video精品| 亚洲欧美日韩综合国产aⅴ| 久久亚洲私人国产精品va媚药 | 国产一区二区高清| 亚洲图片欧美午夜| 欧美激情精品久久久久久黑人| 一级日韩一区在线观看| 久久日韩精品| 国产精品视频yy9299一区| 亚洲伦理网站| 欧美成人免费小视频| 欧美专区在线观看| 国产伦精品一区二区三区视频黑人| 夜久久久久久| 亚洲人人精品| 久久国产精品99国产精| 久久精品综合网| 国产精品乱码久久久久久| 日韩一区二区精品在线观看| 免费91麻豆精品国产自产在线观看| 亚洲女同精品视频| 欧美日韩一区国产| 99日韩精品| 国产日韩欧美成人| 欧美日韩亚洲视频| 在线观看福利一区| 久久久福利视频| 亚洲免费在线观看| 久色成人在线| 亚洲第一精品夜夜躁人人爽| 老牛国产精品一区的观看方式| 羞羞色国产精品| 国产精品亚洲精品| 欧美在线视频免费观看| 欧美在线首页| 欧美色图首页| 毛片一区二区| 欧美mv日韩mv亚洲| 亚洲伦理在线免费看| 91久久久一线二线三线品牌| 欧美国产日韩xxxxx| 亚洲精品在线免费| 亚洲精品三级| 国产精品羞羞答答xxdd| 久久久久欧美精品| 久久综合久久综合久久| 亚洲毛片av| 亚洲天堂成人| 亚洲经典在线看| 国产日韩成人精品| 久久亚洲影院| 欧美另类一区二区三区| 亚洲欧美bt| 香蕉av777xxx色综合一区| 狠狠色丁香婷婷综合久久片| 欧美黄色影院| 国产精品久久波多野结衣| 久久综合国产精品| 欧美激情区在线播放| 久久国产主播| 欧美另类99xxxxx| 久久精品最新地址| 久久国产乱子精品免费女| 在线电影国产精品| 99视频有精品| 亚洲二区在线| 亚洲一区二区在线免费观看视频| 韩日精品中文字幕| 亚洲作爱视频| 在线免费观看日韩欧美| 99香蕉国产精品偷在线观看| 狠狠爱综合网| 亚洲视频在线一区| 亚洲精品日韩欧美| 在线亚洲高清视频| 亚洲人成网站精品片在线观看| 亚洲一区尤物| 亚洲最新在线视频| 久久黄色级2电影| 亚洲欧美日本国产专区一区| 牛牛影视久久网| 久久久999| 国产精品毛片va一区二区三区 | 亚洲美女啪啪| 亚洲一区二区三区激情| 亚洲欧美在线x视频| 一区二区三区欧美日韩| 久久久九九九九| 久久亚洲视频| 国产老肥熟一区二区三区| 亚洲午夜视频在线| 在线视频日韩| 国产精品高潮在线| 亚洲人体大胆视频| 亚洲精品国产精品国产自| 久久精品视频播放| 久久国产手机看片| 国产亚洲欧洲| 午夜国产精品视频| 亚洲自拍偷拍网址| 欧美视频在线视频| 亚洲免费久久| 亚洲色图自拍| 欧美日韩福利| 91久久精品美女高潮| 国产视频在线一区二区| 中国女人久久久| 亚洲一区二区三区四区在线观看| 欧美电影在线观看完整版| 欧美电影在线观看完整版| 亚洲国产精品久久久久秋霞不卡 | 欧美一区成人| 久久久xxx| 在线观看欧美日韩国产| 久久久久久久高潮| 男女精品视频| 91久久久亚洲精品| 亚洲欧美一级二级三级| 亚洲制服av| 国产精品久久久久高潮| 亚洲四色影视在线观看| 欧美一级二级三级蜜桃| 国产一区二区三区不卡在线观看| 欧美影院精品一区| 久热精品视频在线| 91久久线看在观草草青青| 欧美精品一区在线播放| 99国产精品99久久久久久粉嫩| 在线日韩中文| 欧美成人免费全部观看天天性色| 亚洲区一区二| 欧美与黑人午夜性猛交久久久| 国产一区二区三区久久久久久久久| 久久国产主播| 亚洲欧洲日夜超级视频| 欧美一级大片在线免费观看| 黄色成人免费观看| 欧美精品一区二区三区在线看午夜| 99爱精品视频| 美腿丝袜亚洲色图| 一本一本久久| 国产午夜一区二区三区| 免费欧美日韩| 亚洲影院免费| 久久综合给合| 欧美绝品在线观看成人午夜影视| 欧美中文字幕久久| 国产女同一区二区| 欧美激情亚洲综合一区| 午夜精品久久久久久久久久久久|