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.

 
 
 
 

socket实现UDP数据传输

UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 特点:每个数据报中都给出...
  • gxinkai
  • gxinkai
  • 2017年01月11日 18:41
  • 813

java使用UDP协议传输数据

UDP协议(User Datagram Protocol,用户数据报协议)不同于TCP协议,它是不可能靠的,但是它比TCP协议具有更快的传输速度,UDP发送的数据单元称为数据报,当网络传输UDP传输U...
  • awj3584
  • awj3584
  • 2014年04月29日 14:45
  • 6912

TCP和UDP的传输过程以及二者之间的区别

TCP和UDP的区别 TCP     TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。TC...
  • laoniu_c
  • laoniu_c
  • 2014年09月12日 23:34
  • 2497

自学QT之UDP发送数据

例子采用的是单播方式,其他组播和广播也都是一样的代码,稍微修改一下。 首先要写一个发送端。发送端比较简单,只需要几行代码: 当然哦,因为要用到网络,所以这里你需要在pro文件中加入QT+=networ...
  • xuancailinggan
  • xuancailinggan
  • 2016年01月14日 17:12
  • 3458

如何让UDP实现可靠传输

如何让UDP实现可靠传输 自定义通讯协议,在应用层定义一些可靠的协议,比如检测包的顺序,重复包等问题,如果没有收到对方的ACK,重新发包 UDP没有Delievery Garuantee,也没有顺...
  • best_fiends_zxh
  • best_fiends_zxh
  • 2016年12月10日 15:39
  • 3097

c#中关于udp实现可靠地传输(数据包的分组发送) 升级版

在http://blog.csdn.net/zhujunxxxxx/article/details/18798431中我们讨论了,UDP包的发送,但是上一个程序有一个问题,就是数据比较大,一个Mess...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2014年05月21日 00:53
  • 8763

Java使用UDP协议收发数据简单实现

UDP简介1.UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议!简单Java代码实现!适合初学!...
  • YoutellIdo
  • YoutellIdo
  • 2015年08月07日 18:24
  • 8295

java实现TCP与UDP混合传输文件总结

java实现TCP与UDP混合传输文件总结    最近在用java写基于UDP传输文件的网络,遇到了很多问题,也参考了很多人编写的程序,通过 自己的整理和设计,终于写完了自己程序,现在将在编程...
  • u010149189
  • u010149189
  • 2015年04月07日 19:44
  • 1478

qt 下UDP消息的接收和发送和TCP发送文件

#ifndef WIDGET_H #define WIDGET_H #include #include #include #include #include class Widget :...
  • HelloNiGeSB
  • HelloNiGeSB
  • 2016年07月26日 16:28
  • 1413

一个基于UDP的可靠数据传输库

A UDP-based Reliable Data Transfer Library 一个基于UDP的可靠数据传输库   Introduces an open source UDP-based ...
  • zsy19881226
  • zsy19881226
  • 2016年05月30日 22:41
  • 2339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Udp数据接收端实现
举报原因:
原因补充:

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