嵌入式学习-网络-Day02

news2024/10/27 23:42:07

嵌入式学习-网络-Day02

1.优化代码:

网络问题:

2.1虚拟机网络修复

2.2 网络调试

ping

netstat

3.UDP编程

3.1通信流程

3.2函数接口


1.优化代码:

1.端口和ip地址通过命令行传参到代码中。

2.设置客户端退出,服务器结束循环接收。

通过recv返回值为0判断客户端是否退出

3.设置来电显示功能,获取到请求链接服务器的客户端的ip和端口。

4.设置服务器端自动获取自己的ip地址。

INADDR_ANY "0.0.0.0"

5.实现循环服务器,服务器不退出,当链接服务器的客户端退出,服务器等到下一个客户端链接。

6.去掉fgets获取的多余的'\n'.

if(buf[strlen(buf)-1] == '\n')//去掉fgets获取的'\n'

buf[strlen(buf)-1] ='\0';

server.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define N 128
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("please input %s  port\n", argv[0]);
        return -1;
    }

    // 1.创建套接字         协议族    类型    协议
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket err:");
        return -1;
    }
    // 2.填充结构体(ipv4)
    struct sockaddr_in saddr, caddr;
    saddr.sin_family = AF_INET;            // 协议族ipv4
    saddr.sin_port = htons(atoi(argv[1])); // 端口号(网络字节序)
    // saddr.sin_addr.s_addr = inet_addr(argv[1]); // ip地址(网络字节序)
    saddr.sin_addr.s_addr = inet_addr("0.0.0.0");

    socklen_t len = sizeof(caddr);
    // 3.绑定
    int ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
    if (ret < 0)
    {
        perror("bind err:");
        return -1;
    }

    // 4.监听
    if (listen(sockfd, 5) < 0)
    {
        perror("listen err");
        return -1;
    }

    while (1)
    {
        // 5.等待连接
        // int acceptfd = accept(sockfd, NULL, NULL);
        int acceptfd = accept(sockfd, (struct sockaddr *)&caddr, &len);
        if (acceptfd < 0)
        {
            perror("accpet err:");
            return -1;
        }
        printf("acceptfd = %d\n", acceptfd);
        printf("client ip :%s,port:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));

        while (1)
        {
            // 6.接收
            char buf[N] = {};
            ret = recv(acceptfd, buf, N, 0);
            if (ret == -1)
            {
                perror("recv err:");
                return -1;
            }
            else if (ret == 0)
            {
                printf("client exit\n");
                break;
            }
            printf("recv:%s\n", buf);
        }
        // 7.关闭
        close(acceptfd);
    }
    close(sockfd);

    return 0;
}

client.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 128
int main(int argc, char const *argv[])
{

     if (argc != 3)
    {
        printf("please input %s  ip  port\n", argv[0]);
        return -1;
    }
    // 1.创建套接字         协议族    类型    协议
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket err:");
        return -1;
    }
    // 2.填充结构体(ipv4)
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;                          // 协议族ipv4
    addr.sin_port = htons(atoi(argv[2]));                        // 端口号(网络字节序)
    addr.sin_addr.s_addr = inet_addr(argv[1]); // ip地址(网络字节序)
    
    //3.连接
    if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0)
    {
        perror("connect err");
        return -1;
    }
    //4.发送
    char buf[N]={};
    while(1)
    {
        fgets(buf,sizeof(buf),stdin);
        if(buf[strlen(buf)-1] == '\n')
            buf[strlen(buf)-1] = '\0';
        
        if(!strncmp(buf,"quit",4))
            break;
        send(sockfd,buf,N,0);
        printf("send ok\n");
    }
    //5.关闭
    close(sockfd);

    return 0;
}

网络问题:

2.1虚拟机网络修复

虚拟机网络修复

2.2 网络调试

ping

作为平时网络连通检测使用最多的命令,它的作用主要为:

用来检测网络的连通情况;

根据域名得到服务器IP;

根据ping返回的TTL值来判断数据包经过路由器数量。

字节:数据包大小,也就是字节。

时间:响应时间,这个时间越小,说明你连接这个地址速度越快。

TTL:Time To Live,从源到目的,每经过一个路由器,TTL减1,当TTL=0,包丢掉。

netstat

netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP相关的统计数据,一般用于检验本机各端口的网络连接情况。

作用:测试网络状态

netstat -a //查看所有网络连接状态

netstat -at //查看tcp所有网络状态

netstat -au //查看udp所有网络状态

3.UDP编程

3.1通信流程

udp流程:(类似发短信)

server:

创建数据报套接字(socket, (, SOCK_DGRAM,)) ------》有手机

填充结构体(struct ) ---》有号码

绑定 (bind) ---》插卡

接收/发送消息(recvfrom) ----》收、发短信

关闭套接字(close) ---》结束

client:

创建数据报套接字(socket, (, SOCK_DGRAM,)) ------》有手机

填充结构体(struct ) ---》有号码

发送信息(sendto) --->发短信

关闭套接字(close) ---》发送结束

3.2函数接口

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


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

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

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


代码:

server.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define N 128

int main(int argc, char const *argv[])
{
    //1.创建数据报套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd < 0)
    {
        perror("sock err:");
        return -1;
    }
    //2.填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr=inet_addr(argv[1]);

    socklen_t len = sizeof(saddr);

    //3.绑定
    if(bind(sockfd,(struct sockaddr *)&saddr,len) < 0)
    {
        perror("bind err");
        return -1;
    }
    //4.接收
    char buf[N]={};
    recvfrom(sockfd,buf,N,0,NULL,NULL);
    printf("buf:%s\n",buf);
    
    //5.关闭
    close(sockfd);
    return 0;
}


client.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define N 128
int main(int argc, char const *argv[])
{
    //1.创建数据报套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd < 0)
    {
        perror("sock err:");
        return -1;
    }
    //2.填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr=inet_addr(argv[1]);

    socklen_t len = sizeof(saddr);

    //3.发送
    char buf[N]="hello!";
    sendto(sockfd,buf,N,0,(struct sockaddr *)&saddr,len);
    printf("send ok\n");
    //4.关闭
    close(sockfd);
    return 0;
}


练习:实现如客户端发送"hello"给服务器端,服务器接着给客户端回,"recv:hello!!!!!"。

server.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define N 128

int main(int argc, char const *argv[])
{
    //1.创建数据报套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd < 0)
    {
        perror("sock err:");
        return -1;
    }
    //2.填充结构体
    struct sockaddr_in saddr,caddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr=inet_addr(argv[1]);

    socklen_t len = sizeof(saddr);

    //3.绑定
    if(bind(sockfd,(struct sockaddr *)&saddr,len) < 0)
    {
        perror("bind err");
        return -1;
    }
    //4.接收
    char buf[N]={};
    recvfrom(sockfd,buf,N,0,(struct sockaddr *)&caddr,&len);
    printf("client ip:%s,port:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
    
    printf("buf:%s\n",buf);

    strcpy(buf,"hello!!!");
    sendto(sockfd,buf,N,0,(struct sockaddr *)&caddr,len);
    printf("send ok\n");
    //5.关闭
    close(sockfd);
    return 0;
}


client.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 128
int main(int argc, char const *argv[])
{
    // 1.创建数据报套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("sock err:");
        return -1;
    }
    // 2.填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(saddr);

    // 3.发送
    //  char buf[N]="hello!";
    char buf[N] = "";
    fgets(buf, N, stdin);
    if (buf[strlen(buf) - 1] == '\n')
        buf[strlen(buf) - 1] = '\0';

    sendto(sockfd, buf, N, 0, (struct sockaddr *)&saddr, len);
    memset(buf, 0, sizeof(buf));
    recvfrom(sockfd, buf, N, 0, NULL, NULL);
    printf("recvfrom server:%s\n", buf);
    printf("send ok\n");
    // 4.关闭
    close(sockfd);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献&#xff1f;6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…

【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别

一、开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行一个系统&#xff0c;但是每个设备的运算能力和功能都不同&#xff0c;所以内核的设计上&#xff0c;采用了微内核的设计&#xff0c;除了最基础的功能放在内核…

云岚到家 即刻体检 优惠卷管理 总结不熟练的点

多个条件的分页查询 public PageResult<ActivityInfoResDTO> queryPage(ActivityQueryForPageReqDTO reqDTO) {Page<Activity> pagequery new Page<>(reqDTO.getPageNo(),reqDTO.getPageSize());LambdaQueryWrapper<Activity> wrapper new LambdaQ…

C++ | Leetcode C++题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> findWords(vector<string>& words) {vector<string> ans;string rowIdx "12210111011122000010020202";for (auto & word : words) {bool isValid true;cha…

数组实例之三子棋的实现(C语言)

目录 前言 一、三子棋实现的逻辑 二、三子棋的实现 2.1文件的创建添加 2.2 test文件基本逻辑 2.2.1菜单的实现 2.2.2菜单的选择 2.2.3game函数棋盘的实现 2.3game.c文件的编写 2.3.1初始化函数的模块 2.3.2棋盘打印的模块 2.3.3实现棋盘界面的打印 2.3.4实现玩家下…

【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval

文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点&#xff1a; 事实性错误的普遍存在验证的难度&#xff08;可溯源性差&#xff09;难以在有顾虑的情况下排除某些序列适应调整…

Unity插件-Intense TPS 讲解

目录 关于TPS 打开场景&#xff1a;WeaponTest.unity&#xff0c; 只要把这些枪点&#xff0c;打开&#xff08;默认隐藏&#xff0c;不知道为何), 一开始不能运行如何修复 总结 关于TPS 个人不是TPS&#xff0c;FPS的射击游戏爱好者&#xff0c; 不过感觉这个枪感&…

Linux系统中使用yum命令详细安装MariaDB数据库的步骤

前言 mysql和mariadb的区别 MySQL&#xff1a;最初由瑞典的MySQL AB开发&#xff0c;后被Sun Microsystems收购&#xff0c;最终被Oracle收购。MariaDB&#xff1a;由MySQL的原始开发者Michael Widenius领导的团队开发&#xff0c;目标是保持与MySQL的兼容性&#xff0c;并提…

部署前后端分离若依项目--CentOS7宝塔版

准备&#xff1a; CentOS7服务器一台 通过网盘分享的文件&#xff1a;CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个&#xff0c;密码61 若依前端编译后文件 通过网盘分享的文件&#xff1a;ruoyi-admin.jar 链…

【K8S】快速入门Kubernetes

之前企业都是使用容器化和来构建自己的服务和应用程序&#xff0c;其中容器化优点有很多&#xff1a;提升了部署效率、稳定性、提高了资源的利用率降低了成本。 但是也带来了一些新的问题&#xff1a;容器的数量变得很多&#xff0c;管理就是一个新的问题。所以Kubernetes就出…

【K8S系列】Kubernetes 中 Service IP 地址和端口不匹配问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;Service 是实现 Pod 之间和 Pod 与外部之间通信的关键组件。Service 的 IP 地址和端口配置不当可能导致应用无法正常访问。本文将详细分析 Service IP 地址和端口不匹配的问题&#xff0c;常见原因及其解决方案。 一、问题描述 Service IP 地址和…

草稿1111

服务端&#xff1a; 启动nfs服务器服务和rpcbind 服务&#xff1a; 写配置文件&#xff1a; 重新导出所有当前已导出的文件系统&#xff1a; 这个命令会立即停止 firewalld 服务&#xff0c;并将其设置为在系统启动时不自动启动&#xff1a; 客户端&#xff1a; 启动nfs服务器…

练习LabVIEW第十九题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第十九题&#xff1a; 创建一个程序把另外一个VI的前面板显示在Picture控件中 开始编写&#xff1a; 在前面板放置一个二…

银河麒麟V10通过tigervnc实现远程桌面和windows系统连接

1、查看系统版本:uname -a Linux localhost.localdomain 4.19.90-89.16.v2401.ky10.x86_64 #1 SMP Sat Sep 14 13:09:47 CST 2024 x86_64 x86_64 x86_64 GNU/Linux 2、查看是否具有桌面环境:yum grouplist 安装VNC需要具有桌面环境 3.、安装tigervnc: yum install tigervnc…

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…

GoFly快速开发框架已集成了RTSP流媒体服务器(直播、录播)代码插件-开发者集成流媒体服务器更加方便

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;文明浏览&#xff0c;误恶语伤人&#xff01; 说明 本代码包是音视频流媒体服务器&#xff0c;支持RTSP推流到服务器、服务端录像与回放。在视频直播、安防及车辆监控视频上云、无人…

解读AVL树:平衡二叉搜索树的奥秘

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 前言&#xff1a; 前面我们已经介绍了二叉搜…

编译却出现Error: C9555E: Failed to check out a license.问题解决

学stm32的时候&#xff0c;照着操作突然发现编译报错。 去网上搜索答案的时候发现了这篇文章&#xff1a;参考博客:KEI5许可证没到期&#xff0c;编译却出现Error: C9555E: Failed to check out a license.问题解决 根据网上找的资料发现应该是版本问题导致的。在上一篇博客…