Udp数据接收端实现

原创 2006年05月22日 22:06:00
Udp数据接收端实现
----Delphi实现
Lanno Ckeeke        LC2005052202
概要
此程序本想与上一篇实现的功能相同,代码是在delphi6编写。与C++程序相比,其发送端发送数据太快,在一个for循环中连续调用sendto20次,则此程序将不能完全接收到数据。若在for循环中每发送一次数据后 sleep(200),则此程序可以接收全部的数据。这就是UDP数据传输的不可靠性吗?而C++程序(LC2005052201)则不会出现此现象。进一步考虑中。。。。。。
说明
所用到的函数与LC2005052201相同,可以参见上一篇文章。
窗体中一个Button用于启动程序进行必要的socket设置,并开始接收数据(处于阻塞状态);一个EditBox用于显示接收数据的次数;一个ListBox用于显示已接收到的数据。
 
变量说明在代码中有详细的注释。
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.  Dialogs, StdCtrls,Winsock;
  8.  
  9. type
  10.  TForm1 = class(TForm)
  11.     Button2: TButton;    //开始接收数据
  12.     ListBox1: TListBox; //将接收到的数据显示到列表中
  13.     Edit1: TEdit;        //显示接收了多少次数据
  14.     procedure Button2Click(Sender: TObject);
  15.  private
  16.     { Private declarations }
  17.  public
  18.     { Public declarations }
  19.  end;
  20.  
  21.  procedure CheckRc(szErr : PChar);
  22.  
  23. var
  24.  Form1: TForm1;
  25. const
  26.        DEFAULT_PORT = 5150;    //接收端口号
  27.  DEFAULT_COUNT = 20;     //接收20次
  28.  DEFAULT_BUFFER_LENGTH = 4096//接收数据的最大缓冲区大小
  29. var
  30.        nPort : Integer = DEFAULT_PORT;
  31.  dwCount : DWORD = DEFAULT_COUNT;
  32.  dwLength : DWORD = DEFAULT_BUFFER_LENGTH ;
  33.  szInterface : array[0..31of char;
  34.  
  35.  wsd : WSAData; //保存初始化信息
  36.  soRecv : TSOCKET; //接收数据的socket
  37.  pszRecv: PChar;   //接收数据的缓冲区指针
  38.  nRet : integer;
  39.  i : integer;
  40.  dwSenderSize : Integer;
  41.  siSender,local : SOCKADDR_IN;
  42.  nError : Integer;
  43.  
  44. implementation
  45.  
  46. {$R *.dfm}
  47. procedure CheckRc(szErr : PChar);
  48. begin
  49.  MessageBox(0,szErr,'Error',MB_OK);
  50. end;
  51.  
  52. procedure TForm1.Button2Click(Sender: TObject);
  53. var
  54.        i: integer;
  55.  nLastError : Integer;
  56.  nNumOfRecv : Integer;
  57. begin
  58.        nNumOfRecv := 0;
  59.  //初始化socket
  60.        nError := WSAStartup(MakeWord(2,2),wsd);
  61.  if Boolean(nError) then
  62.      MessageBox(0,'WSAStartup','Error',MB_OK);
  63.  //建立socket
  64.  soRecv := socket(AF_INET,SOCK_DGRAM,0);
  65.  if soRecv = SOCKET_ERROR then
  66.  begin
  67.      CheckRc('socket');
  68.  end;
  69.  
  70.   //设置端口与地址
  71.  local.sin_family := AF_INET;
  72.  local.sin_port := htons(5150);
  73.  local.sin_addr.S_addr := inet_addr('127.0.0.1');
  74.   //将socket绑定地址
  75.  nError := bind(soRecv,local,sizeof(local));
  76.  if nError = SOCKET_ERROR then
  77.      CheckRc('bind');
  78.  //分配内存
  79.  pszRecv := AllocMem(4096);
  80.  
  81.  for i := 0 to dwCount -1 do
  82.  begin
  83.      dwSenderSize := SizeOf(siSender);
  84.     //接收发送过来的数据,并保存到缓冲区中
  85.     nRet := recvFrom(soRecv,pszRecv[0],4096,0,siSender,dwSenderSize);
  86.  
  87.     if nRet = SOCKET_ERROR then
  88.     begin
  89.            CheckRc('recvFrom');
  90.       break;
  91.     end else if nRet = 0 then
  92.            break
  93.     else
  94.     begin
  95.            pszRecv[nRet] := #0;
  96.       //添加到列表中,仅用于显示
  97.       self.ListBox1.Items.Add(pszRecv);
  98.     end;
  99.     Inc(nNumOfRecv);
  100.     self.Edit1.Text := IntToStr(nNumOfRecv);
  101.  
  102.  end//end of for
  103.  //关闭 socket
  104.  closesocket(soRecv);
  105.  //释放分配的内存
  106.  FreeMem(pszRecv);
  107.  //清理winsocket
  108.  WSACleanup();
  109. end;
  110.  
  111. end.

 
 
 
 

相关文章推荐

udp接收端程序参考

  • 2012年07月11日 14:55
  • 28KB
  • 下载

基于qt的嵌入式平台输入法:SYSZUXpinyin移植到arm后,UDP接收端中文乱码 本地中文乱码 解决

SYSZUXpinyin输入法完全是用qt搭建的,移植到arm平台后,可以弹出软键盘,本人已成功。移植过程可以参考http://blog.chinaunix.net/uid-24219701-id-3...

创建一个UDP的接收端

/*思路:  * 1.创建一个socket服务对象,注意,此处必须明确一个端口号,否则无法接受成功  * 2.创建一个用于存储接受数据的数据包,方便使用数据包对象的方法解析其中数据  * 3.使用so...

MFC的UDP接收端通信

由于之前一直在弄TCP的MFC程序编写,导致对UDP的MFC情况下的编写不太清楚。摸索了一天,终于知道了UDP的一些情况以及注意事项。 1、UDP介绍 UDP是不保证发送的数据都被接收到,即一端只...
  • xumi13
  • xumi13
  • 2017年03月14日 22:49
  • 424

android 调用c的udp接收端

  • 2013年08月08日 15:52
  • 322KB
  • 下载

UDP接收端缓冲区和丢包问题

转自:http://blog.csdn.net/ljh0302/article/details/49738191 实习项目需要用Winsock内核模式驱动提供的sockets方法,,这个驱动负责...
  • rankun1
  • rankun1
  • 2017年06月28日 19:10
  • 485

STM32单片机ESP8266发送数据到WiFi接收端代码实现

自己使用ESP8266时的代码实现,在博客中分享出来

UDP组播接收端解析

http://www.cnblogs.com/hnrainll/archive/2011/09/02/2163276.html  网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组...
  • zj_2000
  • zj_2000
  • 2011年09月06日 11:44
  • 111

UDP组播接收端解析

网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Udp数据接收端实现
举报原因:
原因补充:

(最多只允许输入30个字)