UDP客户端和服务器

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

UDP客户端,也就是首先主动发送数据的一方,也就是发起服务请求的一方。

UDP服务器,也就是首先等待接收数据,并对接收的数据进行处理,返回计算结果的一方,也就是提供服务的一方。

在下面实验中使用到的函数

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
int send(int s, const void *msg, size_t len, int flags);
in_addr_t inet_addr(const char *cp);
uint16_t htons(uint16_t hostshort);

 udp客户端测试

测试代码 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int client_socket;
    client_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("client_socket = %d",client_socket);

    struct sockaddr_in server_addr;
    server_addr.sin_port = htons(6600);
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("192.168.0.5");
    char buf[100];
    snprintf(buf,sizeof(buf),"time=%d",time(NULL));

    DEBUG_INFO("server_addr %s:%d on socket %d\n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port),
                           client_socket);
    socklen_t addrlen = sizeof(server_addr);
    int send_len = sendto(client_socket,buf,strlen(buf),0,&server_addr,sizeof(server_addr));
    memset(buf,0,sizeof(buf));
    DEBUG_INFO("sendto %s:%d \n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port));
    int read_len = recvfrom(client_socket,buf,sizeof(buf),0,&server_addr,&addrlen);
    DEBUG_INFO("recvfrom %s:%d  -- %s\n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port),
                           buf);
    
    sleep(5);
    return 0;
}

UDP接收端(服务器)

执行代码:

UDP客户端和服务器,linux 应用,udp,服务器,网络协议

  

UDP客户端和服务器,linux 应用,udp,服务器,网络协议

实验解析 

 UDP客户端向192.168.0.5:6600 地址发送时间值,UDP接受端,也就是调试助手,返回一个字符串。然后UDP客户端等待5秒退出。这可以用来实现一个NTP服务器

UDP服务端 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>

// #define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int server_socket;
    int res = 0;
    int on = 1;
    server_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("server_socket = %d",server_socket);

    if(setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR,&on,sizeof(on)) < 0){
        perror("setsockopt");
        exit(-1);
    }

    struct sockaddr_in server_addr;
    server_addr.sin_port = htons(6600);
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("192.168.0.11");

    res = bind(server_socket,(const struct sockaddr *)&server_addr,sizeof(server_addr));
    if(res == -1){
        perror("bind");
        return -1;
    }
    int len = 0;
    char buf[100];
    socklen_t addrlen;
    struct sockaddr_in client_server;
    while(1){
        memset(buf,0,sizeof(buf));
        memcpy(&client_server,&server_addr,sizeof(client_server));
        addrlen = sizeof(client_server);
        recvfrom(server_socket,buf,sizeof(buf),0,&client_server,&addrlen);
        DEBUG_INFO("buf = %s",buf);
        DEBUG_INFO("recfrom %s:%d  -- %s\n",
                           inet_ntoa(client_server.sin_addr),
                           htons(client_server.sin_port),
                           buf);
        addrlen = sizeof(client_server);
        sendto(server_socket,buf,strlen(buf),0,&client_server,addrlen);
    }
    
    sleep(5);
    return 0;
}

修改客户端中的IP地址为192.168.0.11,也就是虚拟机的IP地址

UDP客户端和服务器,linux 应用,udp,服务器,网络协议

 实验解析:

服务器等待接收数据。客户端向服务端发送数据,服务器端接收数据后,将数据原样返回。然后服务端继续等待接收数据。客户端发送完毕后等待接收,接收到数据后睡眠5秒退出程序。

使用connect的客户端 

虽然UDP是无连接的,但是connect函数依然有效,它高速操作系统,默认从哪里接收数据,默认向谁发送数据。这样就可以使用read,wirte、send、recv这四个没有指定地址的函数来收发数据了。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int client_socket;
    int res = 0;
    client_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("client_socket = %d",client_socket);

    struct sockaddr_in remote_addr;
    remote_addr.sin_port = htons(6600);
    remote_addr.sin_family = AF_INET;
    remote_addr.sin_addr.s_addr = inet_addr("192.168.0.11");
    char buf[100];
    snprintf(buf,sizeof(buf),"time=%d",time(NULL));

    DEBUG_INFO("remote_addr %s:%d on socket %d\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           client_socket);
    
    res = connect(client_socket,&remote_addr,sizeof(remote_addr));
    int send_len = send(client_socket,buf,strlen(buf),0);
    memset(buf,0,sizeof(buf));
    int read_len = recv(client_socket,buf,sizeof(buf),0);

    DEBUG_INFO("recv %s:%d  -- %s\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           buf);
    
    sleep(5);
    return 0;
}

 测试结果:

UDP客户端和服务器,linux 应用,udp,服务器,网络协议

既是客户端和也是服务端

如果一个客户端,偶尔也要提供服务的话,那么它绑定(bind)一个明确的本地端口是有必要的,这样别人就知道应该如何主动向它发起通讯了。下面是使用bind绑定本地端口的客户端代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int client_socket;
    int res = 0;
    client_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("client_socket = %d",client_socket);

    struct sockaddr_in remote_addr;
    remote_addr.sin_port = htons(6600);
    remote_addr.sin_family = AF_INET;
    remote_addr.sin_addr.s_addr = inet_addr("192.168.0.11");

    DEBUG_INFO("INADDR_ANY = %d",INADDR_ANY);
    struct sockaddr_in local_addr;
    local_addr.sin_port = htons(6700);
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = INADDR_ANY;//inet_addr("192.168.0.11");

    res = bind(client_socket,(const struct sockaddr *)&local_addr,sizeof(local_addr));
    if(res == -1){
        perror("bind");
        return -1;
    }

    char buf[100];
    snprintf(buf,sizeof(buf),"time=%d",time(NULL));

    DEBUG_INFO("remote_addr %s:%d on socket %d\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           client_socket);
    
    res = connect(client_socket,&remote_addr,sizeof(remote_addr));
    int send_len = send(client_socket,buf,strlen(buf),0);
    memset(buf,0,sizeof(buf));
    int read_len = recv(client_socket,buf,sizeof(buf),0);

    DEBUG_INFO("recv %s:%d  -- %s\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           buf);
    
    sleep(5);
    return 0;
}

执行结果: 

UDP客户端和服务器,linux 应用,udp,服务器,网络协议 实验解析:

服务端使用前面的测试代码。这样通讯两端的IP和PORT就都是已知的了,这样比较适合新手,特别是两边都是经验不足的开发人员。防止思维混乱。

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

小结

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

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

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

相关文章

  • netty构建udp服务器以及发送报文到客户端客户端详细案例

    目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代码中

    2024年04月09日
    浏览(50)
  • 网络编程六--UDP服务器客户端

    UDP(User Datagram Protocol)称为用户数据报协议,是一种无连接的传输协议。 UDP的主要应用在即使丢失部分数据,也不影响整体效果的场景。例实时传输视频或音频时,即使丢失部分数据,也不会影响整体效果,只是会有轻微的画面抖动或杂音。 UDP服务器/客户端不像TCP那样,交

    2024年02月15日
    浏览(35)
  • 【网络编程】实现UDP/TCP客户端、服务器

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、UDP 1、Linux客户端、服务器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客户端 二、T

    2024年02月06日
    浏览(45)
  • day-04 基于UDP的服务器端/客户端

    UDP套接字具有以下特点: 无连接性 :UDP是一种无连接的协议,这意味着在发送数据之前,不需要在发送方和接收方之间建立连接。每个UDP数据包都是独立的,它们可以独立地发送和接收,而不需要维护连接状态。 不可靠性 :UDP是一种不可靠的协议,这意味着它不提供数据传

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

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

    2024年02月11日
    浏览(52)
  • 使用Netty构建TCP和UDP服务器和客户端

    Netty是一个基于Java NIO实现的网络通信框架,提供了高性能、低延迟的网络通信能力。使用Netty构建TCP和UDP服务器和客户端非常简单,下面是一个简单的示例代码: 构建TCP服务器 构建TCP客户端 构建UDP服务器 构建UDP客户端   上述示例代码中,分别定义了一个TCP服务器、TCP客户

    2024年02月16日
    浏览(37)
  • 【网络编程】网络套接字&udp通用服务器和客户端

    端口号(port)是传输层协议的内容: 端口号是一个2字节16位的整数(uint16) 端口号用来标识主机上的一个进程 IP地址+port能够标识网络上的某一台主机和某一个进程 一个端口号只能被一个进程占用 此处我们先对TCP(Transmission Control Protocol 传输控制协议) 有一个直观的认识,后面再

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

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

    2024年03月11日
    浏览(47)
  • UDP数据报网络编程(实现简单的回显服务器,客户端)

           回显服务器表示客户端发的是啥,服务器就返回啥,主要是为了熟悉UDP数据报网络编程的基本步骤         对于程序的所有分析都写到了代码上 当我们用idea实现了上面的代码后可以通过idea如何开启多个客户端(一个代码开启多个客户端运行)来检验多个客户端向

    2024年02月13日
    浏览(47)
  • 【网络编程】基于UDP数据报实现回显服务器/客户端程序

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 前言 我们如果想让应用程序进行网络通信的话,就需要调用传

    2024年02月04日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包