1. 1: using System;
  1. 2: using System.Net;
  1. 3: using System.Net.Sockets;
  1. 4: using System.Text;
  1. 5:  
  1. 6:  
  1. 7: public class UDPListener
  1. 8: {
  1. 9: private const int listenPort = 5050;
  1. 10: private const int Height = 200;
  1. 11: private const int Width = 100;
  1. 12: private static void StartListener()
  1. 13: {
  1. 14: bool[,] test = new bool[Height, Width]; //二维数组的定义方式
  1. 15: byte[,] test1 = new byte[Height, Width];
  1. 16: UdpClient listener = new UdpClient(listenPort); //本机侦听的端口号实例化。
  1. 17: IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); //实例化
  1. 18:  
  1. 19: try
  1. 20: {
  1. 21: long m = 0;
  1. 22: int n = 0; //必须为int型,不然会造成溢出。不能为byte,byte就255.
  1. 23: int i = 0,j = 0;
  1. 24: while (true)
  1. 25: {
  1. 26: n = 0;
  1. 27: Console.WriteLine("Waiting for broadcast");
  1. 28: byte[] bytes = listener.Receive(ref groupEP);
  1. 29: for (i = 0; i < Height; i++)
  1. 30: {
  1. 31: for (j = 0; j < Width; j++)
  1. 32: {
  1. 33: test[i, j] = BitConverter.ToBoolean(bytes,n); //将读到的bytes转换为bool类型的数据,即ture 和  false。
  1. 34: n++;
  1. 35: if (test[i, j] == true)    //将此true 和  false的数组转为只有0与1存在的数组。
  1. 36: test1[i,j] = 1;
  1. 37: else
  1. 38: test1[i,j] = 0;
  1. 39: }
  1. 40: }
  1. 41: for (i = 0; i < Height; i++)
  1. 42: {
  1. 43: for (j = 0; j < Width; j++)
  1. 44: {
  1. 45: Console.Write(test1[i,j]) ;     //调用控制台程序输出即可。
  1. 46: }
  1. 47: Console.WriteLine();
  1. 48: }
  1. 49:
  1. 50: //Console.WriteLine("Received broadcast from {0} : {1} hava received {2} times \n",
  1. 51: // groupEP.ToString(),Encoding.ASCII.GetString(bytes, 0, bytes.Length),m);
  1. 52: }
  1. 53:  
  1. 54: }
  1. 55: catch (Exception e)
  1. 56: {
  1. 57: Console.WriteLine(e.ToString());
  1. 58: }
  1. 59: //finally
  1. 60: //{
  1. 61: // //listener.Close();
  1. 62: //}
  1. 63: }
  1. 64:  
  1. 65: public static int Main()
  1. 66: {
  1. 67: StartListener();
  1. 68:  
  1. 69: return 0;
  1. 70: }
  1. 71: }

UDP接收端小程序,将发送端发送过来的数据转换为稀疏矩阵.

下面是发送端程序:

  1. 1: #include <Winsock2.h>
  1. 2: #pragma comment(lib,"WS2_32.lib")
  1. 3: #include <stdio.h>
  1. 4: #include<iostream>
  1. 5: #include <string>
  1. 6: #include<vector>
  1. 7: using namespace std;
  1. 8: //服务器端口号为5050
  1. 9: #define DEFAULT_PORT 5050
  1. 10: //缓冲区长度
  1. 11: #define DATA_BUFFER 1024
  1. 12:  
  1. 13: void main(int argc,char *argv[])
  1. 14: {
  1. 15:  
  1. 16:
  1. 17: /*matrix.Num = 1;
  1. 18: //matrix.point = new Point[2];
  1. 19: memset(&matrix,0,sizeof(matrix));
  1. 20: matrix.point[0].x = 1;
  1. 21: matrix.point[0].y = 2;
  1. 22: matrix.point[0].value = 3;
  1. 23: matrix.point[0].U = 4;
  1. 24: matrix.point[1].x = 5;
  1. 25: matrix.point[1].y = 6;
  1. 26: matrix.point[1].value = 7;
  1. 27: matrix.point[1].U = 8;
  1. 28: int n = 2;
  1. 29: int len = 2*sizeof(Point)+2;
  1. 30: vector<char> str(len);//声明变长数组
  1. 31: //char* str = new char[n];
  1. 32: //memset(&str,0,sizeof(str));//将str,赋值0,长度为sizeof
  1. 33: memcpy(&str,(char*)&matrix,len);//将matrix里面的值,赋值给str,长度sizeof。与上面刚好相反。
  1. 34:
  1. 35: //char *buffer=(char *)&matrix;
  1. 36: */
  1. 37:
  1. 38: WSADATA wsaData;
  1. 39: SOCKET sClient;
  1. 40: int iPort=5050;
  1. 41: //服务器地址长度
  1. 42: int iLen;
  1. 43: //接收数据的缓冲
  1. 44: int iSend;
  1. 45: int iRecv;
  1. 46: //要发送给服务器的信息
  1. 47: char send_buf[]="I am a client.";
  1. 48: //接收数据的缓冲区
  1. 49: char recv_buf[DATA_BUFFER];
  1. 50: //服务器端地址
  1. 51: struct sockaddr_in ser;
  1. 52: //处理命令行中
  1. 53: //接收数据的缓冲区初始化
  1. 54: memset(recv_buf,0,sizeof(recv_buf));
  1. 55: if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
  1. 56: {
  1. 57: printf("Failed to load Winsock.\n");
  1. 58: return;
  1. 59: }
  1. 60: char map[10][20];
  1. 61: for(int i = 0;i < 10;i++)
  1. 62: for(int j = 0;j < 20;j++)
  1. 63: map[i][j] = 1;
  1. 64:
  1. 65: map[0][0] = 0; // for test
  1. 66: map[0][1] = 0;
  1. 67: map[0][2] = 0;
  1. 68: //map[0][1] = 0;
  1. 69: //for(int i = 0;i < 10;i++)
  1. 70: // for(int j = 0;j < 20;j++)

71: // sendData.obs[i][j] = map[i][j]; //那时候想着把二维数组封装在结构体里面,然后将结构体作为一个对象,通过UDP发送过去。

  1. 72:   //后来发现完全没必要,数组本身我们也可以理解为一个对象,直接发送即可。
  1. 73: //建立服务器端地址
  1. 74: ser.sin_family=AF_INET;
  1. 75: ser.sin_port=htons(iPort);
  1. 76: ser.sin_addr.s_addr=inet_addr("127.0.0.1");
  1. 77: //建立客户端数据报套接口
  1. 78: sClient=socket(AF_INET,SOCK_DGRAM,0);
  1. 79: long k=0;
  1. 80: while (1)
  1. 81: {
  1. 82: if(sClient==INVALID_SOCKET)
  1. 83: {
  1. 84: printf("socket()Failed:%d\n",WSAGetLastError());
  1. 85: return;
  1. 86: }
  1. 87: //向服务器发送数据
  1. 88: Sleep(5);//暂停一秒
  1. 89: iSend=sendto(sClient,(char*)&map,sizeof(map),0,(struct sockaddr*)&ser,iLen);
  1. 90: k=k+1;
  1. 91: if(iSend==SOCKET_ERROR)
  1. 92: {
  1. 93: printf("sendto()Failed:%d\n",WSAGetLastError());
  1. 94: return;
  1. 95: }
  1. 96: else if(iSend==0)
  1. 97: return;
  1. 98: else
  1. 99: printf("sendto()succeeded. have sent %d times \n",k);
  1. 100:  
  1. 101: //从服务器接收数据
  1. 102: //iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&ser,&iLen);
  1. 103: //if(iRecv==SOCKET_ERROR)
  1. 104: //{
  1. 105: // printf("recvfrom()Failed.:%d\n",WSAGetLastError());
  1. 106: // return;
  1. 107: //}
  1. 108: //else if(iRecv==0)
  1. 109: // return;
  1. 110: //else
  1. 111: //{
  1. 112: // //显示从服务器收到的信息
  1. 113: // printf("recvfrom():%s\n",recv_buf);
  1. 114: // printf("---------------------------\n");
  1. 115: //}
  1. 116:
  1. 117: }
  1. 118: closesocket(sClient);
  1. 119: WSACleanup();
  1. 120: }

UDP通信接收端,接收二维数组,内容为0与1的更多相关文章

  1. 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

    引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数   ...

  2. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  3. postman传数组参数,二维数组,多维数组

    一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,

  4. C++入门经典-例6.13-指针与二维数组

    1:代码如下: // 6.13.cpp : 定义控制台应用程序的入口点. // #include"stdafx.h" #include<iostream> using ...

  5. C语言动态生成二维数组

    # 动态创建二维数组示例 #include "stdlib.h" #include "stdio.h" #include <malloc.h> in ...

  6. PHP学习笔记十三【二维数组】

    <?php //二维数组 $arr=array(array(1,2,3),array(4,5,6)); $arr1[0]=array(12,34,65); $arr1[1]=array(34,6 ...

  7. 《Java大学教程》—第16章 二维数组

    多维(Multi-dimensional)数组维数由索引个数决定.常用的数组:一维(one-dimensional)数组.二维(two-dimensional)数组 16.2    创建二维数组索引从 ...

  8. JavaSE-06 二维数组

    学习要点 二维数组的定义 二维数组内存数据结构 不规则二维数组 二维数组的定义 语法格式 格式一 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. ...

  9. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

随机推荐

  1. BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分)

    树的统计CountDescription一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改 ...

  2. 【bzoj4555】[Tjoi2016&Heoi2016]求和 NTT

    题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) ...

  3. Codeforces Round #363 (Div. 2) A 水

    Description There will be a launch of a new, powerful and unusual collider very soon, which located ...

  4. 序列操作(bzoj 1858)

    Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...

  5. webRTC实战总结

    前言 前段时间一直在忙一个基于WebRTC的PC和移动端双向视频的项目.第一次接触webRTC,难免遇到了许多问题,比如:webRTC移动端兼容性检测,如何配置MediaStreamConstrain ...

  6. [LeetCode] Min Stack 栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  7. delphi 内存泄露 分析

  8. ngrx/store effects 使用总结2:列表展示

    第一个计数器案例:http://www.cnblogs.com/axel10/p/8589122.html 完成了计数器案例后,现在开始比较能够完整的展示angular2+开发流程的案例:在线获取用户 ...

  9. 机器学习3_EM算法与混合高斯模型

    ①EM算法: http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html 李航 <统计学习方法>9.1节 ②混合高斯模 ...

  10. 参数化1--jmeter参数化数据(_csvread函数、用户自定义变量等)

    以下是转载内容,仔细看过后,觉得用得最多的应该是csvread函数.用户自定义变量以及CSV DATA CONFIG控制器这几个,但是做练习之后,在结果树和聚合报告中怎么查看执行结果是个问题,没找到对 ...