📄 lc_bcb_103.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>UDP</title>
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">
<meta content="zyqsj" name="Author">
<meta content="Microsoft FrontPage 4.0" name="GENERATOR">
<meta name="ProgId" content="FrontPage.Editor.Document">
</head>
<body>
<h3 align="center"><font size="+2">UDP</font></h3>
<p> <br>
一、说明<br>
使用UDP时,直接使用API代替控件。</p>
<p> 第一个程序(ReadBufferUdp)使用来接收到缓存中。
<p> "Destino"变量非常重要,如果你从其他地方接收数据到Buffer,你必须设置Destino
= 0 并且在以后执行的时候赋值你将要发送的包的地址给它(after
the execution it will have the address which send you the packet.)。<br>
如果你只想从一个指定的地址接收数据,你必须设置变量Destino
= <address>.
<p> "gvEncerrar" 用来中止处理过程。(gvEncerrar被设置为全局变量。)
<p> 超时时间设置。"Inicio + 12" = 12 sec of
timeout.<br>
<br>
第三个程序是用来准备WinSock程序。
<p>二、代码
<p>int ReadBufferUdp(unsigned long *Destino,void *T,int Size)<br>
{<br>
char Buffer[128];<br>
SOCKADDR_IN SockAddr;<br>
int LenSockAddr=sizeof(SOCKADDR_IN);<br>
fd_set FdRead;<br>
struct timeval t_val;<br>
int Ret;<br>
time_t Inicio = time(NULL);
<p> Application->ProcessMessages();<br>
if(gvEncerrar)<br>
return false;
<p> FD_ZERO(&FdRead);<br>
FD_SET(gvSocket,&FdRead);<br>
t_val.tv_sec=0;<br>
t_val.tv_usec=0;
<p> while((Ret=select(0,&FdRead,NULL,NULL,&t_val))!=1
&& (Inicio + 12) ><br>
time(NULL) && !gvEncerrar)<br>
{<br>
FD_ZERO(&FdRead);<br>
FD_SET(gvSocket,&FdRead);<br>
t_val.tv_sec=0;<br>
t_val.tv_usec=0;<br>
Application->ProcessMessages();<br>
}<br>
if(Ret != 1)<br>
return false;
<p>if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)
<p> return false;
<p> if(*Destino == 0)<br>
{<br>
*Destino = SockAddr.sin_addr.s_addr;<br>
}<br>
else<br>
if(*Destino != SockAddr.sin_addr.s_addr)<br>
return false;
<p> memcpy(T,Buffer,Size);<br>
return true;<br>
}
<p>int WriteBufferUdp(unsigned long Destino,void *T,int Size)<br>
{<br>
SOCKADDR_IN SockAddr;<br>
int Sent;
<p> Application->ProcessMessages();<br>
SockAddr.sin_family = AF_INET;<br>
SockAddr.sin_port = gvPortUdp;<br>
SockAddr.sin_addr.s_addr = Destino;<br>
Sent = sendto(gvSocket,(char<br>
*)T,Size,0,(LPSOCKADDR)&SockAddr,sizeof(SockAddr));<br>
if(Sent != Size)<br>
return false;<br>
else<br>
return true;<br>
}
<p>void InicializaTCPIP()<br>
{
<p> WORD wVersionRequested;<br>
WSADATA wsaData;<br>
IN_ADDR In;<br>
PSERVENT PServent;<br>
SOCKADDR_IN SockAddrIn;<br>
wVersionRequested = MAKEWORD( 1, 1 );
<p> if(WSAStartup( wVersionRequested, &wsaData ))<br>
{<br>
ShowMessage("Erro na inicializao do
TCP/IP");<br>
Application->Terminate();<br>
return;<br>
}
<p> // Get the port on service file<br>
if((PServent=getservbyname("your_service_name","udp"))==NULL)<br>
{<br>
ShowMessage("Erro obtendo port do servi
transurb/udp");<br>
Application->Terminate();<br>
return;<br>
}<br>
gvPortUdp = PServent->s_port;<br>
sprintf(StrAux,"Servi transurb/udp
port:%d",ntohs(gvPortUdp));<br>
Log(StrAux);
<p> // Open de Socket<br>
if((gvSocket = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)<br>
{<br>
ShowMessage("Erro na criao do
socket");<br>
Application->Terminate();<br>
return;<br>
}<br>
Log("Socket criado com sucesso");
<p> // Do the bind<br>
SockAddrIn.sin_family = AF_INET;<br>
SockAddrIn.sin_port = gvPortUdp;<br>
SockAddrIn.sin_addr.s_addr = NULL;
<p>if(bind(gvSocket,(LPSOCKADDR)&SockAddrIn,sizeof(SockAddrIn))==SOCKET_ERROR)
<p> {<br>
ShowMessage("Erro no bind do socket");<br>
Application->Terminate();<br>
return;<br>
}<br>
Log("Bind do socket com sucesso");
<p>}</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -