服务端和客户端通信--UDP(含完整源代码)

这篇具有很好参考价值的文章主要介绍了服务端和客户端通信--UDP(含完整源代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UDP通信实验

实验设备:   

目标系统:Windows

软件工具:vs2022/vc6/dev 

实验要求:

  1. 完成UDP服务端和客户端的程序编写;
  2. 分别实现UDP一对一通信和广播通信功能。

实验内容:-static-libgcc

一对一通信

服务器和客户端编程详细步骤:

1、加载/释放Winsock库,创建套接字(WSAStartup()/socket())。

加载方法:

WSADATA wsa;

/*初始化socket资源*/

if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)

{

    return;   //代表失败

}

释放方法:

WSACleanup();

udp通信代码,udp,网络,网络协议,网络安全

2、绑定IP地址、端口等信息到socket上

server.sin_family = AF_INET;

          server.sin_port = htons(12345);   本地监听端口

          server.sin_addr.s_addr = inet_addr(ip);

     udp通信代码,udp,网络,网络协议,网络安全

3、发送数据。用返回的套接字和客户端进行通信(函数recvfrom()sendto())  

  sendto():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to ,   int fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为发送数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小。

返回值:成功返回实际发送出去的信息的字节数,失败返回-1

recvfrom():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为接收数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小,取地址。

返回值:成功返回接收到的信息的字节数,失败返回-1

服务端: 等待客户端接入.char buf[1024].

接收数据:recvfrom(Command_Sock,buf, …)

发送数据:sendto(Command_Sock,buf, …)

客户端: 请求与服务端连接.char buf[1024].

            发送数据:sendto(Client_Sock,buf, …)

          或

           接收数据:recvfrom(Client_Sock,buf, …)

udp通信代码,udp,网络,网络协议,网络安全

4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

closesocket(Listen_Sock)

closesocket(Command_Sock)

udp通信代码,udp,网络,网络协议,网络安全

注意:在dev里面编译会出现报错,需要在项目管理—参数—添加libws2_32.a动态库,该库在C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libws2_32.a路径下。

udp通信代码,udp,网络,网络协议,网络安全

udp通信代码,udp,网络,网络协议,网络安全

代码执行结果:

udp通信代码,udp,网络,网络协议,网络安全

udp通信代码,udp,网络,网络协议,网络安全

 

服务器端完整代码:

 

#include<stdio.h>

#include<stdlib.h>

#include<Winsock2.h>

int main (int agrc,char*argv[])

{

     SOCKET socket1;

     WSADATA wsaData;

     int ErrorCode;

     if(WSAStartup(MAKEWORD(2,1),&wsaData))// windows socket dll;

     {

        printf("Winsock启动失败!!\n");

        WSACleanup();

        return 0;

     }

   

     printf("Winsock start...\n");

     const char* ip="127.0.0.1";

     struct sockaddr_in server;

     int len = sizeof(server);

     server.sin_family = AF_INET;

     server.sin_port = htons(12345); 

     server.sin_addr.s_addr = inet_addr(ip);

   

     socket1 = socket(AF_INET,SOCK_DGRAM,0);

     while (1)

     {

        char buffer[1024] = "/0";

        printf("请输入要发送的信息:\n");

        scanf("%s",buffer);

        //printf("%s",buffer);

        if(strcmp(buffer,"bye")==0)

        {

           printf("exit,bye!!\n");

           Sleep(100);

           closesocket(socket1);

           break;

        }

      

        if(sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)

        {

            printf("发送完毕\n");

            Sleep(100);

            if(recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,&len) != SOCKET_ERROR)

                printf("recevie from server: %s\n",buffer);                                          

        } 

     }

     closesocket(socket1);

     system("pause");

     return 0;

}

客户端完整代码:

#include<stdio.h>

#include<stdlib.h>

#include<Winsock2.h>

int main (int agrc,char*argv[])

{

     SOCKET socket1;

     WSADATA wsaData;

     int ErrorCode;

     if(WSAStartup(MAKEWORD(2,1),&wsaData))// windows socket dll;

     {

        printf("Winsock启动失败!!\n");

        WSACleanup();

        return 0;

     }

   

     printf("Winsock start...\n");

     struct sockaddr_in local;

     struct sockaddr_in client;

     int len = sizeof(client);

     local.sin_family = AF_INET;

     local.sin_port = htons(12345);  //the port need listened

     local.sin_addr.s_addr = INADDR_ANY; //localhost

   

     socket1 = socket(AF_INET,SOCK_DGRAM,0);

     bind(socket1,(struct sockaddr*)&local,sizeof(local));

   

     while (1)

     {

        char buffer[1024] = "/0";

        printf("等待来自服务器发送的信息:\n");

        if(recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&client,&len) != SOCKET_ERROR)

        {

                printf("接收到的信息为: [%s]---%s\n",inet_ntoa(client.sin_addr),buffer);

                //send sth to the client

                sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&client,len);

        }                                            

     }

     closesocket(socket1);

     system("pause");

     return 0;

}

UDP广播通信:

服务器和客户端编程详细步骤:

分析

广播通信是一对多的通信方式,会将消息分发给整个局域网内的所有主机,客户端需要绑定服务端广播使用的端口才能够接收到广播消息。广播地址以192.168.22.3网段为例:192.168.22.255 代表该网段的广播地址,发送给该地址的数据包被所有主机接收。

sendto("你好",192.168.22.255);

发送端

  1. 建立套接字;
  2. 设置该套接字允许进行广播;

     3、将数据发送到广播地址中:sendto(buf,192.168.22.255);

     4、关闭

接收端(服务器)

  1. 建立套接字;
  2. 绑定广播ip地址(192.168.22.255)和端口号9999
  3. 接收数据
  4. 关闭

具体实现过程

广播发送端

1创建数据报套接字 UDP

int socketfd = socket(AF_INET,SOCK_DGRAM,0);

udp通信代码,udp,网络,网络协议,网络安全

2、设置socketfd套接字文件描述符的属性为 广播 。

int on=1;

setsockopt(sockfd , SOL_SOCKET,SO_BROADCAST,&on, sizeof(on));

udp通信代码,udp,网络,网络协议,网络安全

3、发送数据 ,指定接收方为广播地址

struct sockaddr_in sendAddr;

sendAddr.sin_family = AF_INET;

sendAddr.sin_port = htons(9999);

sendAddr.sin_addr.s_addr = inet_addr("192.168.22.255");

sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&sendAddr,sizeof(sendAddr));

udp通信代码,udp,网络,网络协议,网络安全

udp通信代码,udp,网络,网络协议,网络安全

4、关闭

close();

udp通信代码,udp,网络,网络协议,网络安全

广播接收方(服务器端)

1创建用户数据报套接字

int socketfd = socket(AF_INET,SOCK_DGRAM,0);

udp通信代码,udp,网络,网络协议,网络安全

2、绑定(192.168.14.255)广播IP地址和端口号 (10000)

注意:绑定的端口必须和发送方指定的端口相同

struct sockaddr_in ownAddr;

ownAddr.sin_family = AF_INET;

ownAddr.sin_port = htons(10000);

ownAddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY(0.0.0.0) 代表本机所有的地址

udp通信代码,udp,网络,网络协议,网络安全

3、接收数据

recvfrom;

4、关闭套接字

close();
 

源代码:

发送端

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <Winsock2.h>

#include <windows.h>

 

#define GUANG_IP  "192.168.22.255"

#define GUANG_PORT   9999

int main()

{

    //建立套接字

    int socket_fd = socket(AF_INET,SOCK_DGRAM,0);

    if(socket_fd < 0)

    {

       perror("sokcet fail");

       return -1;

    }

   

   

    //设置广播属性

    int on=1;

    setsockopt(socket_fd , SOL_SOCKET,SO_BROADCAST,&on, sizeof(on)); 

   

    //给广播地址发送数据

    struct sockaddr_in send_addr;

    send_addr.sin_family = AF_INET;

    send_addr.sin_port = htons(GUANG_PORT);

    send_addr.sin_addr.s_addr = inet_addr(GUANG_IP);//广播地址

   

    char buf[1024] = {0};

    while(1)

    {  

       bzero(buf,sizeof(buf));

       scanf("%s",buf);

       //发送的是实际的长度

       sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&send_addr,sizeof(send_addr));

    }

   

    //关闭套接字

    close(socket_fd);

}文章来源地址https://www.toymoban.com/news/detail-628902.html

接收端

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <Winsock2.h>

#include <windows.h>

#define GUANG_IP  "192.168.22.255"

#define GUANG_PORT   9999

int main()

{

    //建立套接字

    int socket_fd = socket(AF_INET,SOCK_DGRAM,0);

    if(socket_fd < 0)

    {

       perror("sokcet fail");

       return -1;

    }

   

    //绑定广播地址

    struct sockaddr_in my_addr;

    my_addr.sin_family = AF_INET;

    my_addr.sin_port = htons(GUANG_PORT);

    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY本机任意IP地址--常用方法

    bind(socket_fd,(struct sockaddr *)&my_addr,sizeof(my_addr));

   

    char buf[1024] = {0};

    int ret;

    struct sockaddr_in recv_addr;

    socklen_t addrlen = sizeof(recv_addr);

    while(1)

    {  

       bzero(buf,sizeof(buf));//清空缓冲区

       ret = recvfrom(socket_fd,buf,sizeof(buf),0,(struct sockaddr *)&recv_addr,&addrlen);

       char *ip = inet_ntoa(recv_addr.sin_addr);

       int port = ntohs(recv_addr.sin_port);

       printf("[ip:%s port:%d] buf:%s ret:%d\n",ip,port,buf,ret);

    }

   

    //关闭套接字

    close(socket_fd);

}

到了这里,关于服务端和客户端通信--UDP(含完整源代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Qt专栏】Qt实现TCP服务端和客户端通信

    【Qt专栏】Qt实现TCP服务端和客户端通信

    网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.9.6。 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 好了,两个小程序写完并

    2024年02月12日
    浏览(15)
  • Unity-UDP-客户端/服务器通信功能

    Unity-UDP-客户端/服务器通信功能

    这里简单实现客户端和服务器,复杂的实现需要和前几篇文章的TCP一样,管理多个链接过来的客户端,这里只有一个。需要自己封装类似listener来管理多个链接过来的设备,每次都缓存ReceiveAsync收到消息的中的RemoteEndPoint地址端口,统一管理发送接收消息。 https://zhidao.baidu.c

    2024年02月11日
    浏览(21)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(13)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(48)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(42)
  • C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    我们在开发UDP通信程序时,有时候我们也需要开发UDP服务器程序,这个服务器只需要和一个客户端实现通信,比如这篇博文C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现,但是在实际项目中有的时候需要和多个客户端进行通信,这时和一个客

    2024年01月22日
    浏览(52)
  • C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现

    C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现

    我们在开发UDP通信程序时,除了开发UDP客户端程序,有时候我们也需要开发UDP服务器程序,这在实际项目中是经常会遇到的,所以说掌握UDP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握UDP服务器程序的开发是走向高级工程师的必经之路,也是面试必

    2024年02月03日
    浏览(50)
  • netty的TCP服务端和客户端实现

    2024年02月21日
    浏览(19)
  • Nacos源码 (5) Grpc服务端和客户端

    Nacos 2.x在服务端与客户端直接增加了GRPC通信方式,本文通过2.0.2版本源码,简单分析GRPC通信方式: 服务器启动 客户端连接 客户端心跳 服务器监控检查 api/src/main/proto/nacos_grpc_service.proto文件: 文件定义了通信层的service和message结构,业务层请求响应的序列化和反序列化是Na

    2024年02月10日
    浏览(37)
  • 网络编程——socket服务端和客户端(TCP)

    网络编程——socket服务端和客户端(TCP)

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通

    2024年02月07日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包