网络编程——UDP编程

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

UDP编程步骤

网络编程——UDP编程
在C语言中进行UDP编程的一般步骤如下:

(1)包含头文件
在代码中包含必要的头文件,以便使用UDP编程所需的函数和数据类型。通常情况下,你需要包含 <sys/socket.h>、<netinet/in.h> 和 <arpa/inet.h>。

(2)创建套接字
使用 socket() 函数创建一个套接字,该套接字将用于网络通信。套接字是一个整数值,它表示一个打开的文件描述符,用于在网络上发送和接收数据。

(3)设置地址和端口
创建一个 struct sockaddr_in 结构体,并设置其中的成员变量,包括地址和端口号。这个结构体用于指定服务器的地址和端口。

(4)绑定套接字
使用 bind() 函数将套接字绑定到指定的地址和端口上。这将使服务器能够接收通过该地址和端口发送的UDP数据报。

(5)接收数据
使用 recvfrom() 函数从绑定的套接字接收数据报。该函数将阻塞等待,直到接收到数据报为止。

(6)发送数据
使用 sendto() 函数向特定的目标地址发送数据报。该函数需要指定目标地址和端口,以及要发送的数据。

(7)关闭套接字
在通信结束后,使用 close() 函数关闭套接字,释放资源。

这些步骤提供了一个基本的框架来进行UDP编程。你可以根据需要进行适当的修改和扩展。同时还需要处理错误和异常情况,并确保适当地释放资源,以避免内存泄漏和其他问题。请注意,UDP是面向无连接的协议,因此不需要像TCP那样建立连接和维护状态。每个UDP数据报都是独立的,它们可以单独发送和接收。
网络编程——UDP编程

通信流程

server

(1)创建数据报套接字(socket(,SOCK_DGRAM,))
(2)绑定网络信息(bind())
(3)接收信息(recvfrom())
(4)关闭套接字(close())

client

(1)创建数据报套接字(socket())
(2)指定服务器的网络信息
(3)发送信息(sendto())
(4)关闭套接字(close())文章来源地址https://www.toymoban.com/news/detail-446254.html

函数接口

socket

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
 功能:创建套接字文件  
 参数:
     domain:协议族 ,选择通信方式
        AF_UNIX, AF_LOCAL   本地通信
	AF_INET             IPv4 
	AF_INET6            IPv6  
    type:通信协议-套接字类型
	SOCK_STREAM   流式套接字
	SOCK_DGRAM    数据报套接字
	SOCK_RAW      原始套接字
    protocol:协议  填0,自动匹配底层TCP或UDP等协议。根据type匹配系统默认自动帮助匹配对应协议
     传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
     网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)

返回值:成功。返回同于链接的文件描述符
       失败 -1,更新errno

bind

```c
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
 功能:绑定套接字 - ip和端口
 功能:
   sockfd:套接字文件描述符
   addr:用于通信结构体 (提供的是通用结构体,需要根据选择通信方式,填充对应结构体-通信结构体由socket第一个参数确定)

  addrlen:结构体大小
返回值: 成功0
      失败:-1 更新errno

 通用结构体:  
struct sockaddr{
	sa_family_t sa_family;
	char        sa_data[14];
}

 ipv4的通信结构体:
struct sockaddr_in{
	sa_family_t    sin_family;/*AF_INET */
	in_port_t      sin_port;/* 端口 */
	struct in_addr sin_addr;/* ip地址 */
};
struct in_addr{
	uint32_t       s_addr;
};

本地通信结构体:
struct sockaddr_un{
	sa_family_t sun_family;/* AF_UNIX */
	char        sun_path[108];/* 套接字文件 */
};

recvfrom

ssize_t recvfrom(int sockfd,void*buf,size_t len,int flags,
					struct sockaddr * src_addr,socklen_t * addrlen);
功能:接收数据

参数:
	sockfd:套接字描述符
	buf:接收缓存区的首地址
	len:接收缓存区的大小
	flags:0//调用方式标志位
	src_addr:发送端的网络信息结构体的指针
	addrlen:发送端的网络信息结构体的大小的指针

返回值:
	成功接收的字节个数
	失败:-1
	0:客户端退出

sendto

ssize_t sendto(int sockfd,constvoid*buf,size_t len,int flags,
const struct sockaddr* dest_addr,socklen_t addrlen);
功能:发送数据

参数:
	sockfd:套接字描述符
	buf:发送缓存区的首地址
	len:发送缓存区的大小
	flags:0
	src_addr:接收端的网络信息结构体的指针
	addrlen:接收端的网络信息结构体的大小

返回值: 
	成功发送的字节个数
	失败:-1

举例

UDP客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[MAX_BUFFER_SIZE];

    // 创建UDP套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));

    // 设置服务器地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    server_addr.sin_port = htons(SERVER_PORT);

    // 从标准输入读取数据
    printf("Enter message: ");
    fgets(buffer, MAX_BUFFER_SIZE, stdin);

    // 发送数据到服务器
    sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));

    // 等待接收服务器的响应
    memset(buffer, 0, sizeof(buffer));
    recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);

    // 打印服务器的响应
    printf("Server response: %s\n", buffer);

    // 关闭套接字
    close(sockfd);

    return 0;
}

UDP服务器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define SERVER_PORT 8888

int main() {
    int sockfd;
    struct sockaddr_in server_addr, client_addr;
    char buffer[MAX_BUFFER_SIZE];

    // 创建UDP套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));
    memset(&client_addr, 0, sizeof(client_addr));

    // 设置服务器地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(SERVER_PORT);

    // 绑定服务器地址和端口
    if (bind(sockfd, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    printf("Server running on port %d...\n", SERVER_PORT);

    while (1) {
        // 接收来自客户端的数据
        memset(buffer, 0, sizeof(buffer));
        socklen_t client_len = sizeof(client_addr);
        ssize_t message_size = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client_addr, &client_len);
        if (message_size < 0) {
            perror("recvfrom failed");
            exit(EXIT_FAILURE);
        }

        // 打印客户端发送的数据
        printf("Client message: %s\n", buffer);

        // 向客户端发送响应
        if (sendto(sockfd, buffer, message_size, 0, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0) {
            perror("sendto failed");
            exit(EXIT_FAILURE);
        }
    }
    
    // 关闭套接字
    close(sockfd);

    return 0;
}


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

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

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

相关文章

  • 网络编程 —— TCP 和 UDP 编程详解

    目录 网络编程主要函数介绍 1. socket 函数 2. bind 函数 3. listen 函数 4. accept 函数 5. connect 函数 6. send 函数 7. recv 函数 8. recvfrom 函数 9. sendto 函数 TCP 和 UDP 原理上的区别 TCP 编程 服务端代码: 客户端代码: UDP 编程 服务端代码: 客户端代码: 1. socket 函数 int socket(int domain, int

    2024年02月04日
    浏览(33)
  • UDP网络编程

    1.1、UDP——面向无连接(无连接,是因为UDP里有了对方的地址,直接发就好) 特点:           1、邮件系统服务模式的抽象           2、每个分组都携带完整的目的地址           3、不能保证分组的先后顺序           4、不进行分组出错的恢复和重传           5、不

    2024年02月12日
    浏览(25)
  • 网络编程 tcp udp http编程流程 网络基础知识

    OSI分层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip: 应用层 传输层 网络层 数据链路 ip地址:唯一标识一台主机 ipv4 32位 ipv6 128位 寻址 可以反映物理上的一个变化 MAC地址:48 固化在计算机中 ip地址又两部分构成:网络号+主机号 端口号:标识一个应用程序

    2024年02月13日
    浏览(56)
  • 【网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

    前言: 大家好,我是 良辰丫 ,今天我们一起来学习网络编程,网络编程的基本概念,认识套接字,UDP与TCP编程.💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期待大家三连,关注

    2023年04月20日
    浏览(42)
  • JavaEE——网络编程(UDP套接字编程)

    概念: Socket 套接字就是操作系统给应用程序提供的网络编程 API。 我们可以认为 socket api 是和 传输层 密切相关的。 我们知道,在传输层中,提供了两个最核心的协议,UDP TCP。 因此,socket api 中也提供了两种风格。UDP TCP。 在这里我们简单认识一下 UDP 和 TCP : UDP : 无连接

    2024年02月13日
    浏览(33)
  • Qt - UDP网络编程

    UDP(User Datagram Protocol,用户数据报协议) UDP是一个轻量级、不可靠、面向数据报的、无连接的协议,多用于可靠性要求不严格,不是非常重要的传输。 QUdpSocket类继承自QAbstractSocket,用来发送和接收UDP数据报,”Socket”即套接字,套接字即IP地址+端口号。其中IP地址指定了网络

    2024年04月22日
    浏览(84)
  • 网络编程、UDP、TCP

    就是将地理位置不同的具有独立功能的多台计算及外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件以及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 传播交流信息、数据交换、通信 1.如何准确定位网络上的一台主机 192.xxx.xx.xx:端

    2024年03月10日
    浏览(35)
  • Java网络编程——UDP

    目录 UDP网络通信编程 基本介绍 UDP编程的基本流程 应用实例 本章习题 第一题 服务端 客户端 第二题 服务端 客户端 基本介绍 UDP(User Datagram Protocol)是一种无连接的传输协议,不保证传输数据的可靠性。在网络通信中,UDP常用于那些对实时性要求较高、可靠性要求较低的应

    2024年02月06日
    浏览(27)
  • 网络中UDP编程

        ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                         struct sockaddr *src_addr, socklen_t *addrlen);     功能:         从套接字中接收数据     参数:         sockfd:套接字文件描述符         buf:存放数据空间首地址         flags:属性 默认为0          s

    2024年03月21日
    浏览(20)
  • 第16章_网络编程拓展练习(TCP编程,UDP编程)

    1、学生与老师交互 案例:客户端模拟学生咨询,服务器端模拟咨询老师,进行交互。 客户端收到信息: ​ 欢迎咨询尚硅谷! ​ 这个月的所有期班都已经满了,只能报下一个月的了! 服务器端收到信息: ​ 你好,我想报名这个月的JavaEE就业班! ​ 好的,赶紧给我占个座

    2024年01月20日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包