基于UDP的客户端和服务器端的代码设计

实验平台

linux

实验内容

编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号。

实验原理

UDP是无需连接的通信,其主要实现过程如下:

同样,我们可以按照上一篇博客:基于TCP的客户端和服务器端的代码设计 的办法,将服务器代码分成两部分,一个是初始化,一个是收发数据。但是UDP服务器初始化较为简单,也可以直接写在main函数里。

UDP和TCP在读写数据上较为不同的是,sendto()和recvfrom(),这两个函数较为复杂。通过man手册查询得到:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

参数1:文件描述符;  参数2:要发送的buf数据,是个指针
参数3:目的地的地址,是个指针,在使用时需要强制类型转换成(struct sockaddr *)  参数4:目的地的地址长度。具体的例子看下面代码

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

参数1:文件描述符;  参数2:要接收的buf缓冲区

参数3:接收的来源地址,在使用时需要强制类型转换成(struct sockaddr *)  参数4:一个指针,指向地址长度。具体的例子看下面代码

服务器端代码:udpserver.c

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>

#define BUFFER_SIZE 100
#define PORT 1234

int32_t main(int32_t argc,char *argv[])
{
    struct sockaddr_in server;
    struct sockaddr_in client;
    char buf[BUFFER_SIZE];
    int32_t len = sizeof(client);
    int32_t ret = 0;
    int32_t file_len = 0;

    if (argc != 2)
    {
        printf("Usage ./server [ip]\n");
        return -1;
    }
    int32_t sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("create socket failed!");
        exit(1);
    }

    bzero(&server, sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);     /**< 主机字节序转化成网络字节序 */
    server.sin_addr.s_addr = inet_addr(argv[1]);                /**< 字符串转换in_addr的函数 */

    /**< 绑定服务器 */
    if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        perror("bind failed!");
        exit(1);
    }

    ret = recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&client, &len);
    if (ret < 0)
    {
        perror("recvfrom failed!");
        exit(1);
    }
    buf[ret] = ‘\0‘;
    printf("client message: %s\n", buf);
    printf("client‘s ip is %s, port is %d.\n", inet_ntoa(client.sin_addr), htons(client.sin_port));

    /**< 向客户端发送信息 */
    if (sendto(sockfd, "Welcome to server", BUFFER_SIZE, 0, (struct sockaddr *)&client, len) < 0)
    {
        perror("send file len to client error");
    }

    close(sockfd);
    return 0;
}

客户端代码:udpclient.c

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>

#define BUFFER_SIZE 100
#define PORT 1234

int32_t main(int argc,char *argv[])
{
    struct sockaddr_in server;
    struct sockaddr_in peer;
    char buf[BUFFER_SIZE];
    int32_t len = sizeof(peer);
    char sendbuf[BUFFER_SIZE] = "welcome to client";
    int32_t num = 0;

    if (argc != 2)
    {
        printf("Usage ./client ip\n");
        exit(1);
    }
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("create socket failed!");
        exit(1);
    }
    bzero(&server, sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = inet_addr(argv[1]);

    if (sendto(sockfd, sendbuf, BUFFER_SIZE, 0, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        perror("sendto socket failed!");
        exit(1);
    }

    if ((num = recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&peer, &len)) < 0)
    {
        perror("recvfrom socket failed!");
        exit(1);
    }

    buf[num] = ‘\0‘;
    printf("Server Message: %s\n", buf);

    close(sockfd);

    return 0;
}

Makefile

all:server client

server:udpserver.c
    gcc udpserver.c -o server

client:udpclient.c
    gcc udpclient.c -o client

clean:
    rm -rf server client

实验结果

原文地址:https://www.cnblogs.com/gezhuangzhuang/p/12672208.html

时间: 2024-10-01 04:20:06

基于UDP的客户端和服务器端的代码设计的相关文章

C/S模型:TCP,UDP构建客户端和服务器端(BIO实现

Java中提供了socket编程来构建客户端和服务器端 TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)read/write:进行读写操作,也就是和客户端进行交互(5)close:关闭资源Java中提供了ServiceSocket关键字来构建服务器,在Java中listen和accept合并为一个accept操作,下面通过代码演示一下这5个步骤 public class Server { public s

基于TCP的客户端、服务器端socket编程

一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并向客户端发送字符串. 四.实验原理 使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下 服务器端代码: 1 #include "iostream" 2 #include "netdb.h" 3 #inclu

Tcp小型即时对话消息程序,基于C#的程序,服务器端的代码

namespace SyncChatServer { class User { public TcpClient client{get; private set;} public BinaryReader br{get; private set;} public BinaryWriter bw{get; private set;} public string userName {get; set; } public User(TcpClient client) { this.client = c

C/C++网络编程6——实现基于UDP的服务器端/客户端

前面介绍了基于TCP实现的服务器端和客户端,本节介绍基于UDP实现的服务器端和客户端.UDP协议提供的无连接的,不可靠的传输服务,在一些要求传输速度,可以接受丢包的传输场景应用广泛,比如视频音频传输场景.UDP中只有创建套接字的过程和数据交换的过程. #include <sys/socket.h> sszie_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrl

java socket 基于UDP/IP 协议

Java  socket 基于UDP/IP协议应用 服务器端:  1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据 4.读取数据 客户端: 1.  定义发送信息: 服务器的IP 端口号  发送的内容 2.  创建DatagramPacket,包含将要发送的信息 3.  创建DatagramSocket 4.  发送数据 服务器端 import java.io.IOException; import java.net.Datagram

【TCP/IP网络编程】:06基于UDP的服务器端/客户端

本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先在信封上填好寄信人和收信人的地址,之后贴上邮票放进邮筒即可.当然信件邮寄过程可能会发生丢失,我们也无法随时知晓对方是否已收到信件.也就是说信件是一种不可靠的传输方式,同样的,UDP所提供的也是一种不可靠的数据传输方式(以信件类比UDP只是通信形式上一致性,之前也以电话通信的方式类比了TCP的通信方式

c++ 网络编程(四)TCP/IP LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运算与内存空间占用,相互进程数据交换也很麻烦. 本章的I/O模型就是可以解决这个问题的其中一种模型...废话不多说进入主题-- I/O复用技术主要就是select函数的使用. 一.I/O复用预备知识--select()函数用法与作用 select()用来确定一个或多个套接字的状态(更为本质一点来讲是文

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #in

在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步

在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步 下载安装 vscode-ftp-sync 插件. 安装方法1. Ctrl+Shift+P 输入 ext install [插件关键字/名称] 安装方法2. Ctrl+Shift+P (或F1) 输入 Extensions, 选中 Install Extension然后输入插件名称/关键字 若安装不在插件商店的插件, 则可以放置到用户目录下的 .vscode/extensions 文件夹中.然后重启 VS Code 即可生效