当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>UDP</b>[VC/C++编程]

赞助商链接



  本文“<b>UDP</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1、阐明

利用UDP时,直接利用API替换控件.

第一个程序(ReadBufferUdp)利用来接纳到缓存中.

"Destino"变量非常重要,假如你从其他地方接纳数据到Buffer,你必须设置Destino = 0 并且在今后履行的时刻赋值你将要发送的包的地址给它(after the execution it will have the address which send you the packet.).

假如你只想从一个指定的地址接纳数据,你必须设置变量Destino = <address>.

"gvEncerrar" 用来中止处理历程.(gvEncerrar被设置为全局变量.)

超不时间设置."Inicio + 12" = 12 sec of timeout.

第三个程序是用来预备WinSock程序.

2、代码

int ReadBufferUdp(unsigned long *Destino,void *T,int Size)
{
  char Buffer[128];
  SOCKADDR_IN SockAddr;
  int LenSockAddr=sizeof(SOCKADDR_IN);
  fd_set FdRead;
  struct timeval t_val;
  int Ret;
  time_t Inicio = time(NULL);
  Application->ProcessMessages();
  if(gvEncerrar)
    return false;
  FD_ZERO(&FdRead);
  FD_SET(gvSocket,&FdRead);
  t_val.tv_sec=0;
  t_val.tv_usec=0;
  while((Ret=select(0,&FdRead,NULL,NULL,&t_val))!=1 && (Inicio + 12) >
time(NULL) && !gvEncerrar)
  {
    FD_ZERO(&FdRead);
    FD_SET(gvSocket,&FdRead);
    t_val.tv_sec=0;
    t_val.tv_usec=0;
    Application->ProcessMessages();
  }
  if(Ret != 1)
    return false;
if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)
    return false;
  if(*Destino == 0)
  {
    *Destino = SockAddr.sin_addr.s_addr;
  }
  else
  if(*Destino != SockAddr.sin_addr.s_addr)
    return false;
  memcpy(T,Buffer,Size);
  return true;
}
int WriteBufferUdp(unsigned long Destino,void *T,int Size)
{
  SOCKADDR_IN SockAddr;
  int Sent;
  Application->ProcessMessages();
  SockAddr.sin_family = AF_INET;
  SockAddr.sin_port = gvPortUdp;
  SockAddr.sin_addr.s_addr = Destino;
  Sent = sendto(gvSocket,(char
*)T,Size,0,(LPSOCKADDR)&SockAddr,sizeof(SockAddr));
  if(Sent != Size)
    return false;
  else
    return true;
}
void InicializaTCPIP()
{
  WORD wVersionRequested;
  WSADATA wsaData;
  IN_ADDR In;
  PSERVENT PServent;
  SOCKADDR_IN SockAddrIn;
  wVersionRequested = MAKEWORD( 1, 1 );
  if(WSAStartup( wVersionRequested, &wsaData ))
  {
    ShowMessage("Erro na inicializao do TCP/IP");
    Application->Terminate();
    return;
  }
  // Get the port on service file
  if((PServent=getservbyname("your_service_name","udp"))==NULL)
  {
    ShowMessage("Erro obtendo port do servi transurb/udp");
    Application->Terminate();
    return;
  }
  gvPortUdp = PServent->s_port;
  sprintf(StrAux,"Servi transurb/udp port:%d",ntohs(gvPortUdp));
  Log(StrAux);
  // Open de Socket
  if((gvSocket = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
  {
    ShowMessage("Erro na criao do socket");
    Application->Terminate();
    return;
  }
  Log("Socket criado com sucesso");
  // Do the bind
  SockAddrIn.sin_family = AF_INET;
  SockAddrIn.sin_port = gvPortUdp;
  SockAddrIn.sin_addr.s_addr = NULL;
if(bind(gvSocket,(LPSOCKADDR)&SockAddrIn,sizeof(SockAddrIn))==SOCKET_ERROR)
  {
    ShowMessage("Erro no bind do socket");
    Application->Terminate();
    return;
  }
  Log("Bind do socket com sucesso");
}


  以上是“<b>UDP</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .