精华内容
下载资源
问答
  • UDP单播

    千次阅读 2017-10-12 20:02:45
    Java实现UDP单播对于最近所做的Android手机端遥控器APP,用到了UDP组播和广播方面的知识,虽然网络传输方面并不是由我负责,但是由于期间遇到一些问题,所以我的求知欲有蠢蠢欲动,自己就去了解了一下这方面的知识,...

    Java实现UDP单播

    对于最近所做的Android手机端遥控器APP,用到了UDP组播和广播方面的知识,虽然网络传输方面并不是由我负责,但是由于期间遇到一些问题,所以我的求知欲有蠢蠢欲动,自己就去了解了一下这方面的知识,首先从UDP单播开始给大家分享一下我在学习过程中的感悟。对于UDP的概念在这里就不多做介绍了。


    参考链接

    http://blog.csdn.net/ljheee/article/details/51722792
    查阅了一些前人的博客,对于我而言感觉这位大神写的特别的好,分析很到位,代码也很简洁,直接从用Java来演绎了UDP的使用。
    http://blog.csdn.net/a10615/article/details/52395592
    然后结合了这位前辈对UDP连接客户端和服务端的API的介绍结合起来理解运用起来就更加理解了。

    UDP单播客户端代码

    /**
     * UDP单播的例子
     * @author WangHang
     *
     */
    public class UdpClient {
        public static void main(String[] args) {
            BufferedReader reader =  new BufferedReader(new InputStreamReader(System.in));
            DatagramSocket clientSocket = null;
            byte[] receiveData = new byte[1024];
            try {
                clientSocket = new DatagramSocket();
                InetAddress inetAddress = InetAddress.getByName("localhost");
    //          其实此处的connect方法并不是太符合UDP的设计理念
    //          因为UDP是面向非连接的,说的简单点,瞎发就行了至于有没有人收到,关我神马事,所以还是采用数据包指定IP和端口的方法吧
                clientSocket.connect(inetAddress, 8899);
                String data = reader.readLine();
                byte[] sendData = data.getBytes("utf-8");
                DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length);
    //          当Client没有事先连接到目标IP的端口时(没有调用上面的connect方法),可以在发送的数据包中加上对应的IP和端口
    //          DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length,inetAddress,8899);
                clientSocket.send(datagramPacket);
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                clientSocket.receive(receivePacket);
                InetAddress address = receivePacket.getAddress();
                System.out.println(address);
                if (address != null) {
                    String receive = new String(receivePacket.getData());
                    System.out.println(receive);
                }
    
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (clientSocket != null) {
                    clientSocket.close();
                }
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    UDP单播服务端代码

    /**
     * UDP单播服务端测试代码
     * @author WangHang
     *
     */
    public class UdpServer {
    
        public static void main(String[] args) {
            DatagramSocket serverSocket = null;
            try {
                serverSocket = new DatagramSocket(8899);
                byte [] receiveData = new byte[1024];
                while (true) {
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    serverSocket.receive(receivePacket);
                    System.out.println(new String(receiveData));
                    InetAddress address = receivePacket.getAddress();
                    System.out.println(address);
                    int port = receivePacket.getPort();
    //              接收到消息之后回发一个消息给Client
                    byte[] sendData = "wanghang".getBytes("utf-8"); 
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address,port);
                    serverSocket.send(sendPacket);
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                serverSocket.close();
            }
        }
    }

    注意事项

    这里一定要注意这两段代码只是为了更好理解UDP单播的使用,在实际使用当中一定要将他们都写在单独的线程当中,因为网络连接和发送数据是很耗时的。为了便于测试该测试代码直接使用的localhost,如果要通过真实的网络传输,要自己设置目标的IP,测试起来很简单,先运行server端代码,再运行Client端代码,然后就在控制台上输入你要发送的字符串,回车键之后,就会打印出server端接收到的结果。

    展开全文
  • UDP 单播

    千次阅读 2018-09-11 19:25:55
    1. Linux 服务端 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &...a

    1. Linux 服务端

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    #include <errno.h>
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    
    #define BUF_SIZE 88
    #define PORT     55555
    
    int main(int argc, char *argv[])
    {
        //建立套接字
        int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议
    
        //说明本服务器地址
        const struct sockaddr_in srvaddr = {
            .sin_family = AF_INET,                              //协议类型IPV4
            .sin_port = htons(PORT),                            //端口号-网络字节序
            .sin_addr.s_addr = htonl(INADDR_ANY)                //IP地址-任意地址
        };
    
        //绑定地址
        bind(sock_fd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));
    
        //接收数据
        char buf[BUF_SIZE] = { 0 };
        struct sockaddr_in cliaddr;
        socklen_t cliaddrlen = sizeof(cliaddr);
        while (1)
        {
            bzero(buf, BUF_SIZE);
            bzero(&cliaddr, cliaddrlen);
    
            recvfrom(sock_fd, buf, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &cliaddrlen);
    
            fprintf(stdout, "Recv from [%s - %hu]:%s",
                inet_ntoa(cliaddr.sin_addr),
                ntohs(cliaddr.sin_port),
                buf);
        }
    
        //关闭套接字
        close(sock_fd);
    
        return 0;
    }

    2. Linux 客户端

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    #include <errno.h>
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    
    #define BUF_SIZE 88
    #define PROT     55555
    #define ADDR     "192.168.4.194"
    
    int main(int argc, char *argv[])
    {
        //建立套接字
        int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议
    
        //声明将连接地址
        const struct sockaddr_in  srvaddr = {
            .sin_family = AF_INET,                              //协议类型IPV4
            .sin_port = htons(PROT),                            //端口号-网络字节序
            .sin_addr.s_addr = inet_addr(ADDR)                  //IP地址-字符串转IP
        };
    
        //发送数据
        char buf[BUF_SIZE] = { 0 };
        while (1)
        {
            bzero(buf, BUF_SIZE);
    
            fprintf(stdout, "Say something: ");
            if (fgets(buf, BUF_SIZE, stdin) == NULL)
                break;
    
            sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr));
        }
    
        //关闭套接字
        close(sock_fd);
    
        return 0;
    }

    3. Windows 客户端

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment( lib, "ws2_32.lib")
    
    #define BUF_SIZE 88
    #define PROT     55555
    #define ADDR     "192.168.4.194"
    
    int main(int argc, char *argv[])
    {
        //初始化SOCKET
        WSADATA wsaData;
        int err = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if (err != 0)
        {
            return -1;
        }
    
        if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
        {
            WSACleanup();
            return -1;
        }
    
        //建立套接字
        SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0);        //IPV4,数据报套接字类型,不指定协议
    
        //声明将连接地址
        SOCKADDR_IN srvaddr = {
            .sin_family = AF_INET,                              //协议类型IPV4
            .sin_port = htons(PROT),                            //端口号-网络字节序
            .sin_addr.s_addr = inet_addr(ADDR)                  //IP地址-字符串转IP
        };
    
        //发送数据
        char buf[BUF_SIZE] = { 0 };
        while (1)
        {
            memset(buf, 0, BUF_SIZE);
    
            fprintf(stdout, "Say something: ");
            if (fgets(buf, BUF_SIZE, stdin) == NULL)
                break;
    
            sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr));
        }
    
        //关闭套接字
        closesocket(sock_fd);
    
        return 0;
    }

    4. 测试效果

    客户端
    这里写图片描述

    服务端
    这里写图片描述

    展开全文
  • aeron, 高效可靠的UDP单播UDP多播和IPC消息传输 Aeron 与其他Aeron用户和贡献者进行聊天。 高效可靠的UDP单播。UDP多播和IPC消息传输。 Java和 C++ 客户机在这个存储库中可用,并且可以从方提供一个 .NET 客户机插件...
  • UDP单播组播测试sample

    2020-07-14 16:13:33
    附件包含采用C语言实现的UDP单播 组播参考sample代码 里面包含多个sample代码 供学习使用。
  • Aeron.NET - 高效可靠的UDP单播, UDP组播和IPC消息传输 - Aeron的.NET移植
  • 高效可靠的UDP单播,UDP组播和IPC消息传输。 此存储库中提供Java和C ++客户端,而第三方提供了。 这三个客户端都可以非常高效地跨计算机或通过IPC在同一台计算机上交换消息。 消息流可以由模块记录到持久性存储中,...
  • UDP单播发送与接收.c

    2019-07-03 16:09:51
    UDP单播,发送与接收(代码)详细介绍。单播流程:主机A向主机B发送UDP数据报,发送的目的IP为192.168.1.151,端口为 80,此数据经过UDP层、IP层,到达数据链路层,数据在整个以太网上传播。
  • UDP单播 组播 广播 区别及简单实现

    千次阅读 2020-04-22 16:40:20
    udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件 1、接收方设置组播属性及组播号 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致 广播需具备的条件 1、接收方...

    无论是tcp还是udp 服务器都必须绑定prot、Ip,客户端可以有选择性。

    udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据

    组播需具备的条件  1、接收方设置组播属性及组播号  2、发送方往接收方定义的组播地址发送  3、服务器客户端端口号需要一致

    广播需具备的条件 1、接收方设置广播属性  2、发送方往接收方定义的组播地址发送  3、服务器客户端端口号需要一致


    组播和单播的区别:组播可以多设置一个IP(这里称为为组播地址224打头的),发送方除了可以往接收方绑定的IP发送,也可以                                                                                                                                                             往接收方设置的组播ip发送数据。
    组播和广播的区别:广播需要设置启动接收广播属性,发送方除了可以往接收方绑定的IP发送,也可以往255同网段IP发送。

    这三种udp模型  客户端的实现没有区别,区别仅仅在于发送的网络IP不一样

     

    广播是不会被路由器转发的,特点局域网通信,局域网游戏,客户端的统计 局域网群发等。

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp unicast server code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    /*udp和tcp客户端其实都可以绑定自身的IP端口也可以不绑定,
    不绑定的话系统会为你默认分配,而服务器则必须绑定端口 IP*/

    #include <Winsock2.h>
    #include <iostream>
    #include <thread>

    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }

        // Step 1. Ask system for a socket.this socket is waiter
        SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sockServer == INVALID_SOCKET)
        {
            return 1;
        }

        //Step 2. bind the socket to a local address and port.接待套接字
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        addrServer.sin_port = 30001;
        if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
            sizeof addrServer) == SOCKET_ERROR)
        {
            return 1;
        }

        char buf[100] = { 0 };
        sockaddr_in addrClient;
        int iSize = sizeof(addrClient);

       //recvfrom是阻塞的

        int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);

        closesocket(sockServer);
        WSACleanup();
        return 0;
    }

     

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp unicast Client code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #include <Winsock2.h>
    #include <iostream>
    #include <thread>

    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }

        // Step 1. Ask system for a socket.this socket is waiter
        SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sock2Server == INVALID_SOCKET)
        {
            return 1;
        }

        //绑定自己的port  客户端也可以绑定自己的port ip 指定数据从什么端口出去
        //sockaddr_in addrBind = { 0 };
        //addrBind.sin_family = AF_INET;
        //addrBind.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        //addrBind.sin_port = 30002;
        //if (::bind(sock2Server, reinterpret_cast<const sockaddr*>(&addrBind),
        //    sizeof addrBind) == SOCKET_ERROR)
        //{
        //    return 1;
        //}

        //设置接收方的port ip 下面的端口 ip需要和服务器一致
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        addrServer.sin_port = 30001;

        sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));

        closesocket(sock2Server);
        WSACleanup();
        return 0;
    }

     

     

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp muticast server code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #include <Winsock2.h>
    #include <iostream>
    #include <thread>
    #include<Ws2tcpip.h>   //需要加上此头文件
    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }

        // Step 1. Ask system for a socket.this socket is waiter
        SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sockServer == INVALID_SOCKET)
        {
            return 1;
        }

        //Step 2. bind the socket to a local address and port.接待套接字
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        addrServer.sin_port = 30001;
        if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
            sizeof addrServer) == SOCKET_ERROR)
        {
            return 1;
        }

        //设置接收组播属性 

        ip_mreq mrq;
        mrq.imr_multiaddr.S_un.S_addr = inet_addr("224.0.0.11");//设置组播地址 满足前面是224即可224.0.0.1不能用
        mrq.imr_interface.S_un.S_addr = 0;   //设置自动选择网卡上面接收组播

        if (setsockopt(sockServer, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<const char*>(&mrq), sizeof(mrq))                 ==    SOCKET_ERROR)
        {
            return 1;
        }


        char buf[100] = { 0 };
        sockaddr_in addrClient;
        int iSize = sizeof(addrClient);

        int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);

        closesocket(sockServer);
        WSACleanup();
        return 0;
    }

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp muticast client code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #include <Winsock2.h>
    #include <iostream>
    #include <thread>

    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }


        SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sock2Server == INVALID_SOCKET)
        {
            return 1;
        }

     
        //设置接收方的port ip 下面的端口
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        //点对点的也可以
        //addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        //往服务器组播地址发也可以,相比单播多一个选择性 
        addrServer.sin_addr.S_un.S_addr = inet_addr("224.0.0.11");
        addrServer.sin_port = 30001;

        sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));

        closesocket(sock2Server);
        WSACleanup();
        return 0;
    }

     

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp broadcast server code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    //具备广播的条件  1、接收方设置广播属性 2、发送方往同网段的255IP地址发送 3、服务器客户端端口号需要一致
    #include <Winsock2.h>
    #include <iostream>
    #include <thread>

    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }

        // Step 1. Ask system for a socket.this socket is waiter
        SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sockServer == INVALID_SOCKET)
        {
            return 1;
        }

        //Step 2. bind the socket to a local address and port.接待套接字
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        addrServer.sin_port = 30001;
        if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
            sizeof addrServer) == SOCKET_ERROR)
        {
            return 1;
        }

        //设置接收广播属性 要设置了广播属性才可以接收广播消息   
        bool bEnableBroadcast = true;
        if (setsockopt(sockServer, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*>(&bEnableBroadcast),                                               sizeof(bEnableBroadcast)) == SOCKET_ERROR)
        {
            return 1;
        }

        

        char buf[100] = { 0 };
        sockaddr_in addrClient;
        int iSize = sizeof(addrClient);

        int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);

        closesocket(sockServer);
        WSACleanup();
        return 0;
    }

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      udp broadcast client code

    /------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #include <Winsock2.h>
    #include <iostream>
    #include <thread>

    #pragma comment(lib, "Ws2_32.lib")

    using namespace std;

    int main(void)
    {
        /* 初始化winsock2库 */
        //Step 0. Initialize winsock2 library...
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            return 1;
        }

        // Step 1. Ask system for a socket.this socket is waiter
        SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);

        if (sock2Server == INVALID_SOCKET)
        {
            return 1;
        }

        //广播中服务器设置了广播属性的话 下
        //设置接收方的port ip 下面的端口
        sockaddr_in addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        //点对点的也可以
        //addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
        //往255这个网段发的话 只要是设置了广播属性的服务器都可以接收到数据 
        addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.255");
        addrServer.sin_port = 30001;

        sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));

        closesocket(sock2Server);
        WSACleanup();
        return 0;
    }

     

    展开全文
  • UDP单播通信测试案例C# UDP单播 一段代码做纪念 Client // An highlighted block using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using ...

    UDP单播通信测试案例C#

    UDP单播

    一段代码做纪念

    Client

    // An highlighted block
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Threading;
    using System.Net.Sockets;
    using CRC;
    
    namespace CRC
    {
        public partial class MainForm : Form
        {
            private IPEndPoint ServerInfo;
            private Socket ClientSocket;
            private EndPoint Remote;
            //信息接收缓存
            private Byte[] MsgBuffer;
            //信息发送存储
            private Byte[] MsgSend;
            byte[] data = new byte[1024];
            string input, stringData;
            private Thread CThread;//服务端运行的线程
    
            public MainForm()
            {
                InitializeComponent();
            }
    
            private void MainForm_Load(object sender, EventArgs e)
            {
                //this.CmdSend.Enabled = false;
                //this.CmdExit.Enabled = false;
                MsgBuffer = new Byte[65535];
                MsgSend = new Byte[65535];
                //允许子线程刷新数据
                CheckForIllegalCrossThreadCalls = false;
                Userport.Text = "6888";
                UserIP.Text = "192.168.10.4";
                //127.0.0.1是回环地址,用于测试本机内连接
                //192.168.10.4用来发到其他的主机上
            }
            bool flag = true;//定义一个bool变量,标识是否接收数据
            Thread thread;//创建线程对象
            UdpClient udp;
            private void CmdEnter_Click(object sender, EventArgs e)
            {
                this.CmdEnter.Enabled = false;
                this.CmdExit.Enabled = true;
    
                //设置服务IP,设置TCP端口号  
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.UserIP.Text), 6888);
    
                //定义网络类型,数据连接类型和网络协议UDP  
                Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    
                string welcome = "Hello! ";
                data = Encoding.Unicode.GetBytes(welcome);
                ClientSocket.SendTo(data, data.Length, SocketFlags.None, ipep);
                IPEndPoint sder = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)sder;
    
                data = new byte[1024];
                //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制  
                //server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);  
                int recv = ClientSocket.ReceiveFrom(data, ref Remote);
                this.ReceiveMsg.AppendText("Message received from "+Remote.ToString());
                this.ReceiveMsg.AppendText(Encoding.Unicode.GetString(data, 0, recv));
    
                flag = true;//标识接收数据
                thread = new Thread(() =>//新开线程,执行接收数据操作
                {
                    while (flag)//如果标识为true
                    {
                        try
                        {
                            input = "123456789";
                            ClientSocket.SendTo(Encoding.Unicode.GetBytes(input), Remote);
    
                            data = new byte[1024];
                            recv = ClientSocket.ReceiveFrom(data, ref Remote);
                            stringData = Encoding.Unicode.GetString(data, 0, recv);
                            this.ReceiveMsg.AppendText(stringData+"\n");
                            string OnePareStr = stringData.Substring(0,4);
                            string TwoPareStr = stringData.Substring(4,4);
                            string ThreePareStr = stringData.Substring(8, 4);
                            string FourPareStr = stringData.Substring(12, 4);
                            string FivePareStr = stringData.Substring(16, 4);
                            string deData = Decode(OnePareStr, TwoPareStr, ThreePareStr, FourPareStr, FivePareStr);
                            this.ReceiveMsg.AppendText(deData + "\n");
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);//错误提示
                        }
                        //Thread.Sleep(2000);//线程休眠2秒
                    }
                });
                thread.Start();//启动线程
                 
            }
    
            private string Decode(string onePareStr, string twoPareStr, string threePareStr, string fourPareStr, string fivePareStr)
            {
                string mycode, myc0, myc1, myc2, myc3, myc4;
                Int16 id0, id1, id2, id3, id4;
                id0=System.Convert.ToInt16(onePareStr, 16);
                id1=System.Convert.ToInt16(twoPareStr, 16);
                id2=System.Convert.ToInt16(threePareStr, 16);
                id3=System.Convert.ToInt16(fourPareStr, 16);
                id4=System.Convert.ToInt16(fivePareStr, 16);
                switch (id0){
                    case 2:
                        myc0 = "进站触发";
                        break;
                    default:
                        myc0 = "";
                        break;
                }
                switch (id1)
                {
                    case 1:
                        myc1 = "阎村东";
                        break;
                    default:
                        myc1 = "阎村东";
                        break;
                }
                switch (id2)
                {
                    case 1:
                        myc2 = "阎村东";
                        break;
                    default:
                        myc2 = "阎村东";
                        break;
                }
                switch (id3)
                {
                    case 2:
                        myc3 = "紫草坞";
                        break;
                    default:
                        myc3 = "紫草坞";
                        break;
                }
                switch (id4)
                {
                    case 20:
                        myc4 = "燕山";
                        break;
                    default:
                        myc4 = "燕山";
                        break;
                }
                mycode = myc0+ ",起始站" + myc1 + ",当前站" + myc2 + ",下一站" + myc3 + ",终点站" + myc4;
                return mycode;
            }
    
            private void CmdExit_Click(object sender, EventArgs e)
            {
                ClientSocket.Close();
                
                this.CmdEnter.Enabled = true;
                this.CmdExit.Enabled = false;
    
    
            }
            
        }
    }
    

    Server

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    
    namespace Server
    {
        public partial class MainForm : Form
        {
            //声明将要用到的类
            private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
            private EndPoint Remote;
            private Socket ServerSocket;//服务端运行的SOCKET
            private Thread ServerThread;//服务端运行的线程
            
    
            public MainForm()
            {
                InitializeComponent();
            }
    
            private void MainForm_Load(object sender, EventArgs e)
            {
                this.CmdStar.Enabled = true;
                this.CmdStop.Enabled = false;
                ServerIP.Text= "192.168.10.4";
                RemoteIp.Text= "192.168.10.5";
            }
            // udp.Connect("127.0.0.1", 6888);//127.0.0.1是回环地址,用于测试本机内连接
            //udp.Connect("192.168.1.255", 6888);//192.168.10.5用来发到其他的主机上
            private void CmdStar_Click(object sender, EventArgs e)
            {
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动
                ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(ServerPort.Text));
                ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
    
                ServerThread = new Thread(new ThreadStart(RecieveAccept));//将接受客户端连接的方法委托给线程
                ServerThread.Start();//线程开始运行
    
                CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
    
                this.CmdStar.Enabled = false;
                this.CmdStop.Enabled = true;
                this.StateMsg.Text = "服务正在运行..." + " 运行端口:6888";
                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
            }
            
            //接受客户端连接的方法
            private void RecieveAccept()
            {
                int recv;
                byte[] revData = new byte[1024];
                byte[] sendData = new byte[1024];
                //得到客户机IP 
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.RemoteIp.Text), Convert.ToInt32(RemotePort.Text));
                EndPoint Remote = ipep;
                recv = ServerSocket.ReceiveFrom(revData, ref Remote);
                receiveMsg.Items.Add("我是服务端,客户端连接成功");
                receiveMsg.Items.Add(Encoding.Unicode.GetString(revData, 0, recv));
    
                //客户机连接成功后,发送欢迎信息
                string welcome = "Welcome !";
                sendData = Encoding.Unicode.GetBytes(welcome);
                ServerSocket.SendTo(sendData, sendData.Length, SocketFlags.None, Remote);
    
                while (true)
                {
                    //接受信息
                    recv = ServerSocket.ReceiveFrom(revData, ref Remote);
                    receiveMsg.Items.Add(Encoding.Unicode.GetString(revData, 0, recv));
                    //发送信息
                    string recvDateSucceed = string.Format("服务器已收到.");
                    sendData = Encoding.Unicode.GetBytes(Station_Reporting());
                    ServerSocket.SendTo(sendData, sendData.Length, SocketFlags.None, Remote);
                    //设定周期
                    Thread.Sleep(3000);//阻止设定时间 
                }
            }
    
            private string Station_Reporting()
            {
                //0002 0001 0001 0002 0014  
                //进站触发(0x0002),起始站阎村东(0x0001),当前站阎村东(0x0002),下一站紫草坞(0x0014),终点站燕山(0x0014)
                string baowen = "00020001000100020014";
    
                return baowen;
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                string msg = sendMsg.Text;
                //发送UDP数据包 
                Byte[] data = Encoding.Unicode.GetBytes(msg);
                ServerSocket.SendTo(data, Remote); ;
                receiveMsg.Items.Add("来自服务器的消息:" + sendMsg.Text);
             
    
            }
    
            private void CmdStop_Click(object sender, EventArgs e)
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//关闭socket
    
                this.CmdStar.Enabled = true;
                this.CmdStop.Enabled = false;
                this.StateMsg.Text = "等待运行...";
                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行.");
            }
             
            private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//关闭SOCKET
                Application.Exit();
            }
    
            private void label5_Click(object sender, EventArgs e)
            {
    
            }
        }
    }
    
    
    展开全文
  • Linux C编程 socket—Udp单播Udp简介概述特点Udp单播编程(服务器和客户端基本无差别)函数介绍Udp服务器示例Udp客户端示例 Udp简介 概述 UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个...
  • 网络上缺乏netty的udp单播、组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下。 首先推荐博文: ...
  • linux udp 单播组播广播实现

    千次阅读 2016-10-27 11:43:11
    linux udp 单播组播广播实现 http://blog.csdn.net/zuokong/article/details/7548008 多播广播是用于建立分步式系统:例如网络游戏、ICQ聊天构建、远程视频会议系统的重要工具。使用多播广播的程序和UDP向单个介绍...
  • windows下使用UDP的简单实例,包括单播、广播和多播的实例代码,使用VS2010编写
  • UDP单播小例子 C#

    2015-08-26 13:52:04
    本人是C#小菜鸟,这是自己学习使用udp单播通信时调试通过的例子。 1.首先先定义UdpClient和IPEndPoint类的实例 private UdpClient m_udpClient;  private IPEndPoint m_distanceHost; private IPEndPoint m_...
  • Linux UDP 单播 组播 广播实现

    千次阅读 2014-03-17 14:27:03
    linux udp单播 组播 广播实现   1、组播和广播需要在局域网内才能实现,另外得查看linux系统是否支持多播和广播:ifconfig UP BROADCAST MULTICAST MTU:1500 跃点数:1 说明该网卡支持 2、发送多播包的主机需要...
  • UDP单播通信一、预置条件 A、B在同一台机器,网络中存在往A、B所在的机器的8888端口发送单播UDP数据 A:端口复用绑定在端口8888上 B:端口复用绑定在端口8888上操作步骤:(1)先启动A(2)再启动B(3)B退出预期结果:(1)A ...
  • UDP 单播、广播和多播

    2020-01-06 21:02:35
    本文转载自:... 阅读目录(Content) 一、UDP广播 二、UDP多播1、多播(组播)的概念 2、广域网的多播 三、UDP广播与单播广播与单播的比较 使用UDP协议进行信息的传...
  • 使用UDP协议进行信息的传输之前不...单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。...
  • 求教一个udp单播的收发程序参考一下~想看看怎么写的~网上没找到资料~无尽感谢~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 933
精华内容 373
关键字:

udp单播