⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lc_bcb_103.html

📁 C++Builder教学大全
💻 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>&nbsp;<br>

一、说明<br>

&nbsp;&nbsp; 使用UDP时,直接使用API代替控件。</p>

<p>&nbsp;&nbsp; 第一个程序(ReadBufferUdp)使用来接收到缓存中。

<p>&nbsp;&nbsp; &quot;Destino&quot;变量非常重要,如果你从其他地方接收数据到Buffer,你必须设置Destino 

= 0 并且在以后执行的时候赋值你将要发送的包的地址给它(after 

the execution it will have the address which send you the packet.)。<br>

&nbsp;&nbsp; 

如果你只想从一个指定的地址接收数据,你必须设置变量Destino 

= &lt;address&gt;.

<p>&nbsp;&nbsp; &quot;gvEncerrar&quot; 用来中止处理过程。(gvEncerrar被设置为全局变量。)

<p>&nbsp;&nbsp; 超时时间设置。&quot;Inicio + 12&quot; = 12 sec of 

timeout.<br>

&nbsp;<br>

&nbsp;&nbsp; 第三个程序是用来准备WinSock程序。

<p>二、代码

<p>int ReadBufferUdp(unsigned long *Destino,void *T,int Size)<br>

{<br>

&nbsp;&nbsp; char Buffer[128];<br>

&nbsp;&nbsp; SOCKADDR_IN SockAddr;<br>

&nbsp;&nbsp; int LenSockAddr=sizeof(SOCKADDR_IN);<br>

&nbsp;&nbsp; fd_set FdRead;<br>

&nbsp;&nbsp; struct timeval t_val;<br>

&nbsp;&nbsp; int Ret;<br>

&nbsp;&nbsp; time_t Inicio = time(NULL);

<p>&nbsp;&nbsp; Application-&gt;ProcessMessages();<br>

&nbsp;&nbsp; if(gvEncerrar)<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;

<p>&nbsp;&nbsp; FD_ZERO(&amp;FdRead);<br>

&nbsp;&nbsp; FD_SET(gvSocket,&amp;FdRead);<br>

&nbsp;&nbsp; t_val.tv_sec=0;<br>

&nbsp;&nbsp; t_val.tv_usec=0;

<p>&nbsp;&nbsp; while((Ret=select(0,&amp;FdRead,NULL,NULL,&amp;t_val))!=1 

&amp;&amp; (Inicio + 12) &gt;<br>

time(NULL) &amp;&amp; !gvEncerrar)<br>

&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_ZERO(&amp;FdRead);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_SET(gvSocket,&amp;FdRead);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_val.tv_sec=0;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_val.tv_usec=0;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application-&gt;ProcessMessages();<br>

&nbsp;&nbsp; }<br>

&nbsp;&nbsp; if(Ret != 1)<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;

<p>if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&amp;SockAddr,&amp;LenSockAddr)!=Size)

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;

<p>&nbsp;&nbsp; if(*Destino == 0)<br>

&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *Destino = SockAddr.sin_addr.s_addr;<br>

&nbsp;&nbsp; }<br>

&nbsp;&nbsp; else<br>

&nbsp;&nbsp; if(*Destino != SockAddr.sin_addr.s_addr)<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;

<p>&nbsp;&nbsp; memcpy(T,Buffer,Size);<br>

&nbsp;&nbsp; return true;<br>

}

<p>int WriteBufferUdp(unsigned long Destino,void *T,int Size)<br>

{<br>

&nbsp;&nbsp; SOCKADDR_IN SockAddr;<br>

&nbsp;&nbsp; int Sent;

<p>&nbsp;&nbsp; Application-&gt;ProcessMessages();<br>

&nbsp;&nbsp; SockAddr.sin_family = AF_INET;<br>

&nbsp;&nbsp; SockAddr.sin_port = gvPortUdp;<br>

&nbsp;&nbsp; SockAddr.sin_addr.s_addr = Destino;<br>

&nbsp;&nbsp; Sent = sendto(gvSocket,(char<br>

*)T,Size,0,(LPSOCKADDR)&amp;SockAddr,sizeof(SockAddr));<br>

&nbsp;&nbsp; if(Sent != Size)<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>

&nbsp;&nbsp; else<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>

}

<p>void InicializaTCPIP()<br>

{

<p>&nbsp;&nbsp; WORD wVersionRequested;<br>

&nbsp;&nbsp; WSADATA wsaData;<br>

&nbsp;&nbsp; IN_ADDR In;<br>

&nbsp;&nbsp; PSERVENT PServent;<br>

&nbsp;&nbsp; SOCKADDR_IN SockAddrIn;<br>

&nbsp;&nbsp; wVersionRequested = MAKEWORD( 1, 1 );

<p>&nbsp; if(WSAStartup( wVersionRequested, &amp;wsaData ))<br>

&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;Erro na inicializao do 

TCP/IP&quot;);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application-&gt;Terminate();<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>

&nbsp;&nbsp; }

<p>&nbsp;&nbsp; // Get the port on service file<br>

&nbsp;&nbsp; 

if((PServent=getservbyname(&quot;your_service_name&quot;,&quot;udp&quot;))==NULL)<br>

&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;Erro obtendo port do servi 

transurb/udp&quot;);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application-&gt;Terminate();<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>

&nbsp;&nbsp; }<br>

&nbsp;&nbsp; gvPortUdp = PServent-&gt;s_port;<br>

&nbsp;&nbsp; sprintf(StrAux,&quot;Servi transurb/udp 

port:%d&quot;,ntohs(gvPortUdp));<br>

&nbsp;&nbsp; Log(StrAux);

<p>&nbsp;&nbsp; // Open de Socket<br>

&nbsp;&nbsp; if((gvSocket = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)<br>

&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;Erro na criao do 

socket&quot;);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application-&gt;Terminate();<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>

&nbsp;&nbsp; }<br>

&nbsp;&nbsp; Log(&quot;Socket criado com sucesso&quot;);

<p>&nbsp;&nbsp; // Do the bind<br>

&nbsp;&nbsp; SockAddrIn.sin_family = AF_INET;<br>

&nbsp;&nbsp; SockAddrIn.sin_port = gvPortUdp;<br>

&nbsp;&nbsp; SockAddrIn.sin_addr.s_addr = NULL;

<p>if(bind(gvSocket,(LPSOCKADDR)&amp;SockAddrIn,sizeof(SockAddrIn))==SOCKET_ERROR)

<p>&nbsp;&nbsp; {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;Erro no bind do socket&quot;);<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application-&gt;Terminate();<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>

&nbsp;&nbsp; }<br>

&nbsp;&nbsp; Log(&quot;Bind do socket com sucesso&quot;);

<p>}</p>



</body>



</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -