【计网】从零开始使用UDP进行socket编程 --- 客户端与服务端的通信实现

UDP协议实现客户端与服务端通信

在这里插入图片描述

人生不过如此,且行且珍惜。
自己永远是自己的主角,
不要总在别人的戏剧里充当着配角。
--- 林语堂 ---

1 客户端与服务端的通信

我们了解了网络编程的大概,今天我们就来使用UDP协议来实现客户端与服务端之间的通信过程:

  1. 客户端可以向服务端发送数据,并接收服务端传回的反馈信息。
  2. 服务端接收客户端发送的数据,并根据数据进行处理,重新发送给客户端。

通过这个框架我们可以的扩展出翻译单词 , 多人聊天的功能。可以说只要实现服务端与客户端的通信,获取到的数据,就可对数据进行各种各样的处理!所以网络通信的基础很重要

我们先来回顾一下UDP socket编程的一些常用接口:

创建socket文件:

NAME
socket - create an endpoint for communication
SYNOPSIS
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

domain: 选择通信方式 — 本地通信与网络通信
type: 选择协议— UDP/TCP
protocol: 默认使用0、
返回值是创建的socket文件操作符socketfd


bind绑定 ,将socket文件与IP地址绑定和端口号,也就是将进程与文件进行绑定。这样当数据包到达该端口和地址时,操作系统知道应该将数据传递给哪个应用程序。

NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

绑定时需要传入对应的struct sockaddr结构体指针和空间大小。我们知道其为父类,派生类有两种: sockaddr_in 和 sockaddr_un,按照需求强制类型转换就可以!


发送数据

NAME

 send, sendto, sendmsg - send a message on a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t send(int sockfd, const void *buf, size_t len, int flags);

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

       ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

一般使用sendto函数

  1. sockfd: socket文件操作符,绑定了确定的IP地址与端口,保证数据按照该文件绑定的方式进行通信
  2. buf:指向包含要发送数据的缓冲区的指针。这个缓冲区应该已经填充了您想要发送的数据。
  3. len:buf指向的缓冲区中数据的长度,以字节为单位。这个值告诉sendto函数要发送多少字节的数据。
  4. flags:这个参数通常设置为0,表示没有特殊的发送选项。不过,它可以是一些标志的组合,比如 MSG_CONFIRM(用于TCP,确认路径是有效的)或MSG_DONTROUTE(数据不应该通过网关发送)。
  5. dest_addr:指向sockaddr结构体的指针,该结构体包含了数据将要发送到的目标地址和端口。对于IPv4,这通常是一个sockaddr_in结构体,而对于IPv6,则是一个sockaddr_in6结构体。
  6. addrlen:dest_addr指向的sockaddr结构体的大小,以字节为单位。这确保了无论在何种平台上,传递给sendto的都是正确的字节大小。

获取数据

NAME
       recv, recvfrom, recvmsg - receive a message from a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

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

       ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

一般使用recvfrom函数,从socket文件中获取数据,并可以得到发送者的信息

  1. sockfd:从指定的socket文件中读取数据
  2. buf:缓冲区,将数据读取到这里
  3. len:缓冲区的长度
  4. src_addr:输出型参数,获取发送者的信息
  5. addrlen:输出型参数,获取发送者结构体的长度

认识了这些基础的函数,接下来我们就可以来实现服务器类了!

2 设计UDP服务器类

2.1 基础框架设计

首先我们先来搭建基础框架:

  1. 通过智能指针建立Udp对象
  2. Udpserver对象不可拷贝!
  3. Udpserver类内部需要一个_sockfd 文件操作符,_localport
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我龙翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值