LINUX[网络编程]

sendto函数的应用:向to结构体指针指向的IP,发送UDP数据

细节请看我注释,注满细节

代码:

#include <stdio.h>

#include <sys/socket.h> //socket函数

#include <unistd.h> //close函数

#include <string.h> //memset strlen函数

#include <netinet/in.h> //struct sockaddr_in结构体

#include <arpa/inet.h> //inet_pton函数

int main(int argc, char const *argv\[\])

{

// 创建用于通信的UDP套接字

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

if (sockfd == 0)

{

perror("socket");

return 0;

}

printf("sockfd=%d\n", sockfd);

// 发送数据函数sendto:可以向to结构体指针指向的IP,发送UDP数据

char buf\[\] = "hello world";

// 目的地址信息

struct sockaddr_in dst_addr;

memset(&dst_addr, 0, sizeof(dst_addr)); // memset是初始化

dst_addr.sin_family = AF_INET; // IPV4

dst_addr.sin_port = htons(8000); // 端口(port)

//  htons的功能:将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)

// 将目的IP赋值到地址结构体中

inet_pton(AF_INET, "192.168.31.37", &dst_addr.sin_addr.s_addr); // 将"10.9.11.251"转到s_addr里(大端)

char buf2\[\] = "你好,帅哥";

// 如果套接字,没有事先用(bind函数)绑定固定的IP及端口

// 那么第一次调用sendto的时候,系统会给本地主机IP,以及随机端口,作为发送者的源地址信息

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

sendto(sockfd, buf2, strlen(buf2), 0, (const struct sockaddr *)&dst_addr, sizeof(dst_addr));

close(sockfd);

}

详细解读:

  1. 头文件包含:

    • stdio.h:标准输入输出库,用于 printf 和 perror 函数。
    • sys/socket.h:包含 socket 函数的声明,用于创建套接字。
    • unistd.h:包含 close 函数的声明,用于关闭套接字。
    • string.h:包含 memset 和 strlen 函数的声明,用于内存初始化和字符串长度计算。
    • netinet/in.h:定义了 sockaddr_in 结构体,用于存储 IP 地址和端口信息。
    • arpa/inet.h:包含了一些网络编程中常用的函数,如 inet_pton。
  2. 在 main 函数中:

    • 创建一个 UDP 套接字 sockfd,使用 socket 函数,指定地址族为 AF_INET,类型为 SOCK_DGRAM 表示 UDP 套接字。
    • 如果 socket 函数返回值为 0,表示创建套接字失败,输出错误信息并返回。
    • 初始化一个发送的数据 buf,内容为 "hello world"。
    • 初始化目的地址信息 dst_addr 结构体,将其清零并设置地址族为 AF_INET,端口为 8000。
    • 使用 inet_pton 将目的IP地址 "192.168.31.37" 转换为网络字节序并赋值给 dst_addr.sin_addr.s_addr。
    • 初始化另一个发送的数据 buf2,内容为 "你好,帅哥"。
    • 调用 sendto 函数两次,分别发送 buf 和 buf2 的数据到目的地址 dst_addr。
    • 最后关闭套接字 sockfd。

这段代码通过 UDP 协议向指定的 IP 地址("192.168.31.37")的端口 8000 发送了两个数据包,分别是 "hello world" 和 "你好,帅哥"。发送数据时使用了 sendto 函数,该函数可以发送数据到指定的目的地址。在网络编程中,UDP 是一种无连接的传输协议,发送数据时不需要建立连接,适用于一些要求实时性较高的场景。

最后完毕:

说说我的感觉,md,真不喜欢学习,还是自己已掌握的领域才能让自己感觉舒服,感觉自己才是领导者,老师傅;工科没出路,高级打工人

相关推荐
Rabitebla3 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
火云代理3 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
威嵌神州4 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Decay__5 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
java_logo5 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
火云代理7 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖7 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump8 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风9 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
少司府9 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件