程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> UDP

UDP

編輯:關於C++

一、說明

使用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程序。

二、代碼

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");
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved