UDP 服务器与多个客户端通信

服务端为上位机部分。客户端为下位机部分,下位机有多个MCU,所以就会有不同的IP地址。上位机实现接收下位机的信息,并区别不同的IP发来的信息。通信端口5000

服务端:IP设置为196.168.1.100

   int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);

    if(sock_fd < 0)

    {

        printf("error: Create Socket Failed!");

        return -1;

    }

    

    struct sockaddr_in sock_addr;

    sock_addr.sin_family = AF_INET;

    sock_addr.sin_port = htons(5000);

    sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    memset(sock_addr.sin_zero, 0x00, 8);

    

    try

    {

        if(bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) != 0)   //绑定

        {

            printf("error: Bind Socket Failed!");

            res = -1;

            throw res;

        }

        

        char buf[256];

        int recvslen;

        struct sockaddr_in from;

        uint32_t fromlen = sizeof(struct sockaddr);

        while(1)

        {

            if((recvslen = recvfrom(sock_fd, recvs, 256, 0, (struct sockaddr *)&from , &fromlen)) == -1)

            {

                printf("error: Receiving Failed!");

                res = -1;

                throw res;

            }

            else

            {

                if(recvslen < 256)

                    *(recvs+recvslen) = ‘\0‘;

                else

                    *(recvs+255) = ‘\0‘;

        if (from.sin_addr.s_addr == inet_addr(196.168.1.2)){      //根据from的IP地址来确定是接收的哪个IP发来的信息

                  printf("Received data:\n[%s] from 196.168.1.2\n",recvs);

        }

            }

        }

    }

    catch(...)

    {

        printf("error catched~");

    }

客户端:以IP 196.168.1.2为例

 int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);

    if(sock_fd < 0)

    {

        printf("error: Create Socket Failed!");

        return -1;

    }

    

    struct sockaddr_in addrTo;

    addrTo.sin_family = AF_INET;

    addrTo.sin_port = htons(5000);

    addrTo.sin_addr.s_addr = htonl("196.168.1.100");  //服务端的地址

    memset(addrTo.sin_zero, 0x00, 8);

    

    try

    {

        char buf[256] = "This is from 196.168.1.2";

        int n;

        struct sockaddr_in to;

        uint32_t tolen = sizeof(struct sockaddr);

        while(1)

        {

            if((n= recvfrom(sock_fd, recvs, 5000, 0, (struct sockaddr *)&addrTo, &tolen)) == -1)

            {

                printf("error: Receiving Failed!");

                res = -1;

                throw res;

            }

            else if (n > 0)

            { 

        printf("Send data to 196.168.1.100\n");

            }

        }

    }

    catch(...)

    {

        printf("error catched~");

    }

时间: 2024-11-07 23:21:00

UDP 服务器与多个客户端通信的相关文章

服务器与多个客户端通信

使用多路复用实现一个服务器与多个客户端的通信:代码范例: 服务器: #include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include<strings.h> void se

Python 绝技 —— UDP 服务器与客户端

i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 -- TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演示了 TCP 服务器与客户端的通信过程. 本篇将按照同样的套路,先介绍传输层的另一个核心协议 UDP,再比较 TCP 与 UDP 的特点,最后借助 Python 脚本演示 UDP 服务器与客户端的通信过程. 0x01 UDP 协议 UDP(User Datagram Protocol,用户数据报协议

java服务器与linux c客户端之间udp通信

java服务器和 linux c客户端采用udp协议互相通信,最关键的点是数据结构的统一.比如说,在c中一个char型 是8bit,在java中,char 是16bit,所以c和java的char类型不能直接互相转换.在本例程中,c的char 类型和 java的byte类型,两个数据类型都是8bit,这样就保证了数据正确传输的基本条件之一. java服务器代码如下: import java.io.*; import java.lang.*; import java.net.*; public c

Python全栈__服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

1.服务器与多客户端通信 1 import socket 2 # 创建tcp socket的套接字 3 sk = socket.socket() 4 # bind 5 sk.bind(('127.0.0.1',8080)) 6 # 监听 7 sk.listen(5) 8 # 等待连接 9 while 1: 10 conn, addr = sk.accept() 11 while 1: 12 msg_s = input('>>>') 13 conn.send(msg_s.encode('u

uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)

目前移植uip,发现UDP 服务器模式下,必须指定本地端口以及客户端端口,否则只能讲客户端端口设置为0,才能接收任意端口的数据,但是无法发送数据,因为此时客户端端口设置为0了,我通过将原始数据包中的客户端端口保存下来,并且在发送的时候将客户端端口替换为指定的端口,发送完成之后又设置为0,这样就实现了向任意客户端端口发送数据. uip.c if(uip_udp_conn->lport != 0 && UDPBUF->destport == uip_udp_conn->lpo

windows下UDP服务器和客户端的实现

UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据. 服务器端 1.初始化 WASStartup ( ... ) 2.创建Socket s = socket ( .. ) 3.绑定 bind( .. ) 4.收发数据 recvfrom( .. ) sendto(..) 5.关闭连接,释放资源 closesocket(..) WSACleanup() 客户端 // 无需绑定 1.初始化 WASStartup ( ... ) 2.创建Socket s =

UDP服务器/客户端代码示例

UDP服务器代码: 1 #include <errno.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <iostream> 9 10 usi

【windows socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. 网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层.传输层.网际层