Udp数据接收端实现

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 
  5. #include 
  6. #include 
  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.                    <
  68.          }
  69.  
  70.      }
  71.      //关闭socket连接
  72.      closesocket(soRecv);
  73.      delete[] pszRecv;
  74.  
  75.      //清理
  76.      WSACleanup();
  77.  
  78.      return 0;
  79. }

 

你可能感兴趣的:(C/C++,Windows系统)