TCP、UDP客户端

TCP客户端

#include <mystdio.h>

#define CLI_PORT 6666
#define CLI_IP "192.168.124.210"

int main(int argc, const char *argv[])//argv[1] IP  argv[2] 端口号
{
    if(argc <3)
    {
        printf("请在命令传参端口号和IP地址\n");
        return -1;
    }
    //创建流式套接字文件
    int cfd = socket(AF_INET,SOCK_STREAM,0);
    if(cfd < 0)
    {
        perror("socket");
        return -1;
    }
    printf("socket seccuss cfd = %d  __%d__\n",cfd,__LINE__);
    //允许端口号重复使用
    int reuse = 1;
    if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {
        perror("setsockopt");
        return -1;
    }
    
    //填充客户端自身的地址信息,给bind函数绑定使用;
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port   = htons(CLI_PORT);
    cin.sin_addr.s_addr   = inet_addr(CLI_IP);
    

    //填充服务器的地址信息,给connet函数使用
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(atoi(argv[1]));
    sin.sin_addr.s_addr = inet_addr(argv[2]);
    
    //连接指定的服务器
    if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        perror("connect");
        return -1;
    }
    printf("connet seccuss __%d__\n",__LINE__);
    
    
    char buf[128]="";
    ssize_t res;
    while(1)
    {
        //从终端输入数据
        printf("请输入数据>>>\n");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = '\0';
        //发送数据
        res = send(cfd,buf,sizeof(buf),0);
        if(res < 0)
        {
            perror("send");
            return -1;
        }
    
        //接收
        bzero(buf,sizeof(buf));
        res = recv(cfd,buf,sizeof(buf),0);
        if(res < 0)
        {
            perror("recv");
            return -1;
        }
        else if(0 == res)
        {
            printf("服务器下线 __%d__\n",__LINE__);
            break;
        }
        printf("%s __%d__",buf,__LINE__);
        
    
    }

    close(cfd);

    return 0;
}

UDP客户端

#include <mystdio.h>

#define PORT 8888
#define IP "192.168.124.210"

int main(int argc, const char *argv[])
{
    int cfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cfd < 0)
    {
        fprintf(stderr,"line:%d",__LINE__);
        perror("sockaddr");
        return -1;
    }
    printf("创建报式套接字成功 cfd=%d __%d__\n",cfd,__LINE__);
    //允许端口被重复使用
    int reuse = 1;
    if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {    
        fprintf(stderr,"line:%d",__LINE__);
        perror("setsockopt");
        return -1;
    }
    //填充服务器的地址信息
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET;
    sin.sin_port         = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);


    char buf[128] = "";
    struct sockaddr_in rcv;
    socklen_t addrlen = sizeof(rcv);
    while(1)
    {
        bzero(buf,sizeof(buf));
        printf("请输入信息>>>\n");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = '\0';
        if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
        {
            fprintf(stderr,"line:%d",__LINE__);
            perror("sendto");
            return -1;
        }
        if(strcmp(buf,"quit") == 0)
        {
            break;
        }
        printf("发送成功\n");

        bzero(buf,sizeof(buf));
        if(recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&rcv,&addrlen)<0)
        {
            fprintf(stderr,"line:%d",__LINE__);
            perror("recvfrom");
            return -1;
        }
        if(strcmp(buf,"quit") == 0)
        {
            break;
        }
        printf("[%s:%d]  %s  __%d__\n",\
                inet_ntoa(rcv.sin_addr),ntohs(rcv.sin_port),buf,__LINE__);
        }

    close(cfd);
    return 0;
}

机械臂

#include <mystdio.h>

#define CLI_PORT 6666
#define CLI_IP "192.168.124.210"

int main(int argc, const char *argv[])//argv[1] IP  argv[2] 端口号
{
    if(argc <3)
    {
        printf("请在命令传参端口号和IP地址\n");
        return -1;
    }
    //创建流式套接字文件
    int cfd = socket(AF_INET,SOCK_STREAM,0);
    if(cfd < 0)
    {
        perror("socket");
        return -1;
    }
    printf("socket seccuss cfd = %d  __%d__\n",cfd,__LINE__);
    //允许端口号重复使用
    int reuse = 1;
    if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {
        perror("setsockopt");
        return -1;
    }

    //填充服务器的地址信息,给connet函数使用
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(atoi(argv[1]));
    sin.sin_addr.s_addr = inet_addr(argv[2]);
    
    //连接指定的服务器
    if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        perror("connect");
        return -1;
    }
    printf("connet seccuss __%d__\n",__LINE__);
    
    int fd = open("/dev/input/event1",O_RDONLY);
    if(fd<0)
    {
        perror("open");
        return -1;
    }
        
    struct input_event ev;
    
    char buf[5]={0xff,0x02,0x00,30,0xff};
    unsigned char str[5] = {0xff,0x02,0x01,20,0xff};
    if(send(cfd,buf,sizeof(buf),0)< 0)
    {
        perror("send");
        return -1;
    }
    if(send(cfd,str,sizeof(str),0)< 0)
    {
        perror("send");
        return -1;
    }

    while(1)
    {
        if(read(fd,&ev,sizeof(ev))<0)
        {
            perror("read");
            return -1;
        }

        switch(ev.code*ev.value)
        {
        case 17:
            buf[3] += 5;
            if(buf[3]>90)
                buf[3] = 90;
            break;
        case 31:
            buf[3] -= 5;
            if(buf[3] < -90)
                buf[3] = -90;
            break;
        case 30:
            str[3] -= 5;
            if(str[3] < 0)
                str[3] = 0;
            break;
        case 32:
            str[3] += 5;
            if(str[3] >180 )
                str[3] = 180;
            break;
        default:
            continue;
        }
        
        if(send(cfd,buf,sizeof(buf),0)<0)
        {
            perror("send");
            return -1;
        }
        if(send(cfd,str,sizeof(str),0)<0)
        {
            perror("send");
            return -1;
        }

    }
    close(cfd);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

371D - Vessels

思路&#xff1a;用并查集维护&#xff0c;如果当前容器没有满&#xff0c;就指向自己&#xff0c;否则指向下一个容器。 这样就可以快速 find 到下一个没有满的容器&#xff0c;从而模拟询问 1。 代码&#xff1a; void solve(){int n;cin >> n;vector<int>p(n …

JRT1.5发布演示

JRT1.5演示视频 这是一次思想的解放&#xff0c;这是一次自我的挑战&#xff0c;这是一次涅槃重生。信创、安可、Linux、麒麟、UOS、King、PGSQL、ARM、Java围绕在我周围。JRT在DotNetCore的基础上完成了重生。对我而言&#xff0c;它不仅仅是一套框架那么简单&#xff1b;它更…

探索嵌入式系统:快速入门指南概览

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【数据结构(邓俊辉)学习笔记】向量03——常规向量

文章目录 0.概述1.元素访问2.置乱器3.判等器与比较器4.无序查找4.1 判等器4.2 顺序查找4.3 实现4.4 复杂度 5. 插入5.1 算法实现5.2 复杂度分析 6. 删除6.1 区间删除6.2 单元删除6.3 复杂度 7. 唯一化7.1 实现7.2 正确性7.3 复杂度 8. 遍历8.1 实现8.2 复杂度 9. 总结 0.概述 …

CUDA线程管理

核函数在主机端启动时&#xff0c;执行会转移到设备上&#xff0c;并且将控制权转移回主机。当核函数在GPU上运行时&#xff0c;主机可以运行其他函数。因此&#xff0c;主机与核函数是异步的。 此时&#xff0c;设备端也就是GPU上会产生大量的线程&#xff0c;并且每个线程都…

手势估计 | 使用TensorRT实现的实时手势估计+手势分类

项目应用场景 面向手势识别场景&#xff0c;项目具有实时手势识别 手势分类功能&#xff0c;采用 TensorRT 进行 GPU 加速推理&#xff0c;可通过手势识别进行远程控制。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 git clone https://github.com/NVIDIA-…

初入单元测试

单元测试&#xff1a;针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试 Junit可以用来对方法进行测试&#xff0c;虽然是有第三方公司开发&#xff0c;但是很多开发工具已经集成了&#xff0c;如IDEA。 Junit 优点&#xff1a;可以灵活的编写测试代码&am…

2024年Java接单平台强力推荐!各个都知名!

Java这几年真卷飞了&#xff0c;一点都不夸张。因此&#xff0c;很多程序员朋友都已经试着转方向、换赛道了。试着接单、找私活就是一大途径。当然&#xff0c;特别是有技术、又有相对空闲时间的朋友&#xff0c;更值得一试。既是增加收入的捷径&#xff0c;又可以提升自我——…

SQL Server 中语句显示红色波浪线,提示对象/列名无效解决方法(无其他任何显式错误的情况)

拼写 名称等都没有出现任何错误时&#xff0c;依旧报错&#xff1a;对象/列名无效 解决步骤&#xff1a; 工具-选项-文本编辑器-Transact-SQL-IntelliSense重新勾选 启用 IntelliSense或者将 最大脚本大小改为 无限制 当然 工具卡了也可能会失效&#xff0c;进行 刷新 保存 或…

智慧安防视频监控EasyCVR视频汇聚平台无法自动播放视频的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…

开源大模型Llama3,堪比GPT-4。手把手本地安装,纯小白可操作,不需要编程经验,国内可下载,可视化使用。

最近最劲爆科技动态&#xff0c;Meta开源Llama3模型&#xff0c;最强开源模型。 Llama3发布后&#xff0c;扎克伯格亲自给媒体表示“要超越所有人&#xff0c;做最领先AI”。 吴恩达等一众大佬表示祝贺。 在线体验地址&#xff1a;https://www.meta.ai/ 不过国内在线体验基本…

【服务器部署篇】Linux下Ansible安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

MySQL的root用户无法远程连接

默认root用户只允许本地连接&#xff0c;所以需要修改mysql库中user表中名为root的用户的host为“%” select Host,User from user;UPDATE mysql.user SET host % WHERE user root; FLUSH PRIVILEGES;

一文整理完MySQL关系型数据库相关知识

MySQL关系型数据库 1. 介绍1.1 MySQL 2. 安装3. SQL语句4. SQL分类5. DDL5.1 库的DDL5.2 表、列的DDL 6. DML6.1 添加数据6.2 修改数据6.3 删除数据 7. DQL7.1 基础查询7.2 条件查询7.3 排序查询7.4 聚合函数7.5 分组查询7.6 分页查询 8. 约束8.1 约束分类 9. 多表查询9.1 内连…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑&#xff0c;判断对象类型是否是InitializingBean的子类型&#xff0c;如果是&#x…

Vue+OpenLayers7入门到实战,OpenLayers加载GeoJson数据并叠加GeoJson中的要素到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上加载GeoJson数据并叠加GeoJson中的要素到OpenLayers矢量图层上。 GeoJson数据格式可以参考博主另一篇文章《GIS开发入门,GeoJSON是什么?GeoJSON格式标准介绍》,那么…

TLV61048非同步升压BOOST转换器输入电压2.6-5.5V输出电流4A输出电压最高15V

推荐原因&#xff1a; 输入电压较低&#xff0c;输出电流可达3.5A SOT23-6封装 批量价格约0.70元 TLV61048引脚 TLV61048引脚功能 7 详细说明 7.1 概述 TLV61048是一款非同步升压转换器&#xff0c;支持高达 15 V 的输出电压和输入范围从 2.61 V 到 5.5 V。该TLV61048集成了…

不用写一行代码,就能让你的公众号华丽变身成AI智能,超详细的攻略来了~

为了让你的公众号华丽变身成AI智能&#xff0c;我们用到了扣子AI&#xff0c;不用写一行代码&#xff0c;只需要三个步骤&#xff1a;创建Bot、关联公众号、发布Bot。 下面我来给你一个个讲解。 首先打开扣子官网&#xff0c;注册并登录&#xff0c;进入主页面之后就可以开始…

DSPy入门:告别指令提示,拥抱编程之旅!

原文&#xff1a;intro-to-dspy-goodbye-prompting-hello-programming 2024 年 2 月 27 日 DSPy框架如何通过用编程和编译代替提示来解决基于LLM的应用程序中的脆弱性问题。 目前&#xff0c;使用大型语言模型(LLMs)构建应用程序不仅复杂而且脆弱。典型的pipelines通常使用pr…

解决“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误方法

在计算机使用过程中&#xff0c;遇到诸如“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误提示并不罕见。这类问题往往会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。本文旨在详细阐述MSVCP120.dll文件的重要性、其丢失的可能原因&#xff0c;以及解决方法&a…