Udp数据接收端实现

原创 2006年05月22日 21:40:00
Udp数据接收端实现
Lanno Ckeeke        LC2005052201
概要
Udp协议为非面向连接的协议,数据的发送与接收并不需要像TCP/IP协议那样事先建立连接,因此在数据发送速度及资源消耗表现上都胜于TCP/IP;但UDP为非可靠协议其发送(接收)数据并不一定能够保证对方能够正确的接收(发送),其可靠性需要另外的机制来实现。
 
发送端的实现用到的几个函数
1.        WSAStartup:启动Winsocket
2.        socket:创建Socket,参数指定为SOCK_DGRAM
3.        bind:设置用于接收数据的端口和地址
4.        recvfrom:从socket中接收数据
5.        closesocket:关闭socket
6.        WSACleanup:关闭socket
 
与TCP/IP相比不需要调用的函数:
1.        listen :监听socket
2.        accept :接收客户端的请求
 
代码实现:
建立UDP接收端程序,它接收30次数据,之后便会退出程序,对于发送端的其它数据将不以处理;接收数据的最大长度为4096,超过此长度将会发生截断。
  1. // zUdpSocket.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <WinSock2.h>
  6. #include <Windows.h>
  7. using namespace std;
  8.  
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.      WSAData wsd;           //初始化信息
  12.      SOCKET soRecv;              //接收SOCKET
  13.      char * pszRecv = NULL; //接收数据的数据缓冲区指针
  14.      int nRet = 0;
  15.      int i = 0;
  16.      int dwSendSize = 0;
  17.      SOCKADDR_IN siRemote,siLocal;    //远程发送机地址和本机接收机地址
  18.  
  19.      //启动Winsock
  20.      if (WSAStartup(MAKEWORD(2,2),&wsd) != 0) {
  21.          cout << "WSAStartup Error = " << WSAGetLastError() << endl;
  22.          return 0;
  23.      }
  24.  
  25.      //创建socket
  26.      soRecv = socket(AF_INET,SOCK_DGRAM,0);
  27.      if (soRecv == SOCKET_ERROR) {
  28.          cout << "socket Error = " << WSAGetLastError() << endl;
  29.          return 1;
  30.      }
  31.  
  32.      //设置端口号
  33.      int nPort = 5150;
  34.  
  35.      //int nPort = 1234;
  36.      siLocal.sin_family = AF_INET;
  37.      siLocal.sin_port = htons(nPort);
  38.      siLocal.sin_addr.s_addr = inet_addr("127.0.0.1");
  39.  
  40.      //绑定本地地址到socket
  41.      if (bind(soRecv,(SOCKADDR*)&siLocal,sizeof(siLocal)) == SOCKET_ERROR) {
  42.          cout << "bind Error = " << WSAGetLastError() << endl;
  43.          return 1;
  44.      }
  45.  
  46.      //申请内存
  47.      pszRecv = new char[4096];
  48.      if (pszRecv == NULL) {
  49.          cout << "pszRecv new char Error " << endl;
  50.          return 0;
  51.      }
  52.  
  53.      for (int i = 0; i < 30; i ++){
  54.          dwSendSize = sizeof(siRemote);
  55.          //开始接受数据
  56.          nRet = recvfrom(soRecv,pszRecv,4096,0,(SOCKADDR*)&siRemote,&dwSendSize);
  57.          if (nRet == SOCKET_ERROR) {
  58.               cout << "recvfrom Error " << WSAGetLastError() << endl;
  59.               break;
  60.          }
  61.          else if (nRet == 0) {
  62.               break;
  63.          }
  64.          else{
  65.               pszRecv[nRet] = '/0';
  66.               cout << inet_ntoa(siRemote.sin_addr) << endl
  67.                    <<pszRecv << endl;
  68.          }
  69.  
  70.      }
  71.      //关闭socket连接
  72.      closesocket(soRecv);
  73.      delete[] pszRecv;
  74.  
  75.      //清理
  76.      WSACleanup();
  77.  
  78.      return 0;
  79. }

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

创建一个UDP的接收端

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

MFC的UDP接收端通信

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

udp接收端程序参考

  • 2012-07-11 14:55
  • 28KB
  • 下载

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

转自:http://blog.csdn.net/ljh0302/article/details/49738191 实习项目需要用Winsock内核模式驱动提供的sockets方法,,这个驱动负责...

android 调用c的udp接收端

  • 2013-08-08 15:52
  • 322KB
  • 下载

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

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

UDP组播接收端解析

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

UDP组播接收端解析

网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最...

UDP:socket服务端和接收端的基本使用实例

服务端代码: package com.franky.net; import java.io.IOException; import java.net.DatagramPacket; import j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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