网络编程day2

TCP的基本通信

服务器端

#include <head.h>
#define SER_PORT 8888                  //服务器端口号
#define SER_IP  "192.168.125.193"      //服务器客户端

int main(int argc, const char *argv[])
{
    //1、创建用于连接的套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);  
    //参数1:通信域,表明使用的是ipv4协议
    //参数2:通信方式,使用TCP通信
    //参数3:0表示之前已经指定协议 IPPROTO_TCP
    
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);               //3


    //将端口号快速重用函数
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    //2、给当前套接字绑定IP地址和端口号
    //2.1填充要绑定的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;        //通信域
    sin.sin_port =         htons(SER_PORT);  //端口号
    sin.sin_addr.s_addr =     inet_addr(SER_IP);    //ip地址

    //2.2 绑定
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success %s %s %d\n", __FILE__, __func__, __LINE__);

    //3、将套接字设置成监听状态
    if(listen(sfd, 128) == -1)
    {
        perror("listen error");
        return -1;
    }
    printf("listen success %s %s %d\n", __FILE__, __func__, __LINE__);

    //4、阻塞等待客户端的链接请求
    //4.1定义容器接收客户端的地址信息
    struct sockaddr_in cin;                  //用于接收地址信息
    socklen_t socklen = sizeof(cin);          //用于接收地址信息的大小

    int newfd = -1;
    //4.2 接收客户端的链接
    newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);   
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }
    printf("[%s:%d]发来链接请求 %s %s %d\n", \
           inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),__FILE__, __func__, __LINE__);

    //5、跟客户端进行消息通信
    char buf[128] = "";
    while(1)
    {
        //将数组清空
        bzero(buf, sizeof(buf));

        //读取客户端发来的消息
        //int res = read(newfd, buf, sizeof(buf));
        int res = recv(newfd, buf, sizeof(buf), 0);
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

        //给客户端发消息
        strcat(buf, "*_*");

        //write(newfd, buf, sizeof(buf));
        send(newfd, buf, sizeof(buf), 0);
        printf("发送成功\n");
    }

    //6、关闭套接字
    close(newfd);
    close(sfd);
    return 0;
}

客户端

#include <head.h>
#define SER_PORT  8888             //服务器端口号
#define SER_IP "192.168.125.193"    //服务器ip地址
#define CLI_PORT 6666                //客户端的端口号
#define CLI_IP "192.168.125.193"       //客户端ip地址

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符
    int cfd = -1;
    cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n", cfd);            //3

    //2、绑定(可选)
    //2.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CLI_PORT);
    cin.sin_addr.s_addr = inet_addr(CLI_IP);
    //2.2绑定
    if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return  -1;
    }
    printf("bind  success\n");
    
    //3、连接服务器
    //3.1 填充服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;
    sin.sin_port =         htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    //3.2 连接
    if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("connect success\n");
    
    //4、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);   //从终端输入数据
        buf[strlen(buf)-1] = 0;          //将换行改为'\0'

        //发送给服务器
        send(cfd, buf, sizeof(buf), 0);
        printf("发送成功\n");
        if(strcmp(buf, "quit") == 0)
        {
            break;
        }

        //接收服务器发来的消息
        recv(cfd, buf, sizeof(buf), 0);
        printf("[%s:%d]:%s\n", SER_IP, SER_PORT, buf);
    }

    //5、关闭套接字
    close(cfd);

    return 0;
}

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

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

相关文章

一篇文章搞懂Jenkins持续集成解决的是什么问题

01 持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

@Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求&#xff0c;需要开发一个注解&#xff0c;放在controller层的类或者方法上&#xff0c;用以校验请求参数中(不管是url还是body体内&#xff0c;都要检查&#xff0c;有token参数&#xff0c;且符合校验规则就放行)是否传了一个token的参数&am…

从零学Java 线程池

Java 线程池 文章目录 Java 线程池1 线程池概念1.1 现有问题1.2 线程池 2 线程池原理3 如何使用线程池3.1 获取线程池 4 创建线程的第四种方式 1 线程池概念 1.1 现有问题 线程是宝贵的内存资源、单个线程约占1MB空间&#xff0c;过多分配易造成内存溢出。频繁的创建及销毁线…

新版网易滑块

突然发现脸皮厚根本没用&#xff0c;大冬天的&#xff0c;风吹过来还是会冷。 大哥们多整件衣裳&#xff0c;好冷&#xff01;&#xff01;&#xff01;&#xff01; 网易更新了&#xff0c;这俩 dt跟f值。 dt为 这里返回的&#xff0c;忽略掉他。 data参数中的d值&#xff…

基于深度学习的时间序列算法总结

1.概述 深度学习方法是一种利用神经网络模型进行高级模式识别和自动特征提取的机器学习方法&#xff0c;近年来在时序预测领域取得了很好的成果。常用的深度学习模型包括循环神经网络&#xff08;RNN&#xff09;、长短时记忆网络&#xff08;LSTM&#xff09;、门控循环单元&a…

【C++】演讲比赛流程管理系统

1、演讲比赛程序需求 2、项目创建 参考之前的案例文章&#xff0c;去创建项目 3、创建管理类 4、菜单功能 5、退出功能 6、演讲比赛功能

【LV12 DAY9 ADC实验】

电压在1501mv~1800mv时&#xff0c;LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时&#xff0c;LED2、LED3、LED4点亮 电压在501mv~1000mv时&#xff0c;LED2、LED3点亮 电压在0mv~500mv时&#xff0c;LED2闪烁 #include "exynos_4412.h"void delay(unsigned in…

【从0上手cornerstone3D】核心概念解析(下)

前言 渲染Dicom文件的具体流程请查看&#xff1a;如何渲染一个基础的Dicom文件&#xff08;上&#xff09;Github演示&#xff1a;https://github.com/jianyaoo/vue-cornerstone-demo逻辑图在线链接&#xff1a;逻辑图在线链接在线查看显示效果&#xff08;加载需时间&#xf…

产品经理NPDP

产品经理是告诉团队做正确的事情&#xff0c;项目经理是告诉团队正确地做事情 产品经理的核心能力是商业洞察能力、产品规划与设计、团队管理能力。 产品经理国际资格认证(NPDP)

解决防爬虫机制方法(二)

最近为了完成学校的大数据的作业&#xff0c;老师要我们爬一个的网站&#xff0c;里面有还算不错的防爬机制&#xff0c;忙活了几天&#xff0c;总结出一些常见的防爬机制的应对方法&#xff0c;方法均来自个人实战总结&#xff0c;非专业爬虫角度分析 承接上一次讲的方法解决…

短视频账号矩阵剪辑分发系统无人直播技术开发源头

一、全行业独家源头最全面的核心技术 短视频矩阵新玩法是指利用批量自动混剪系统来处理大量短视频&#xff0c;通过智能算法自动进行视频剪辑、场景切换、特效添加等操作&#xff0c;最终生成高质量、精彩纷呈的混剪视频作品的方法和技术。这一方法的出现使得大规模短视频制作…

实验数据查询

数据查询 一、实验目的 掌握使用SQL的SELECT语句进行基本查询的方法。掌握使用SELECT语句进行条件查询的方法。掌握SELECT语句的GROUP BY、ORDER BY以及UNION子句的作用和使用方法。掌握嵌套查询的方法。掌握连接查询的操作方法。 二、实验内容SQL的SELECT语句进行基本查询的…

Java SE入门及基础(14)

二重循环 1. 什么是二重循环 二重循环就是一个循环结构中又包含另外一个循环结构 while ( 外层循环条件 ){ //外层循环操作 while ( 内层循环条件 ){ //内层循环操作 } //外层循环操作 } while ( 外层循环条件 ){ //外层循环操作 for ( 循环变量初始化 ; 内层循环条…

闪存的基础知识1-Vt的编码

系列文章目录 目录 前言 一、SLC的编码 二、使SLC的编码 三、格雷码的介绍 1.定义&#xff1a; 2.举例 总结 前言 本节主要介绍闪存的一些编码规则 一、SLC的编码 对于SLC来说&#xff0c;可以定义编程态为0、擦除态为1。 二、使SLC的编码 对MLC来说&#xff0c;因为有四个状…

SDK游戏盾是什么?,sdk游戏盾有什么作用

在现今的游戏市场&#xff0c;游戏保护成为了每个游戏开发者都不能忽视的重要环节。恶意破解、作弊和盗版等问题严重影响了游戏的安全性和商业价值。而如何保护自己的游戏免受这些威胁&#xff0c;已经成为游戏开发者们面临的重大挑战。好在SDK游戏盾&#xff0c;它如同保护游戏…

JVM 一些重要配置参数

1、内存配置参数 -Xmx<size>&#xff1a;设置Java堆的最大内存。如 -Xmx2g 将堆的最大大小设置为2G&#xff0c;推荐配置为系统可用内存的70-80%-Xms<size>&#xff1a;设置Java堆的初始内存。如 -Xms2g 将堆的初始大小设置为2G&#xff0c;推荐配置与-Xmx的值相同…

【设计模式-05】Facade门面Mediator调停者 | Decorator装饰器 | Chain Of Responsibility责任链

Facade门面Mediator调停者 1、Facade门面图解 2、Mediator调停者 一般是系统内部相互交错&#xff0c;比如消息中间件(MQ)就是这种设计模式&#xff0c;对各个功能或系统之间进行解耦。 Decorator装饰器 1、问题 2、解决方案 Chain Of Responsibility责任链 一、例子场景 业…

循环冗余校验(Cyclic Redundancy Check, CRC)计算

若信息码字为111000110&#xff0c;生成多项式G(x)x^5x^3x1&#xff0c;则计算出的CRC校验码为&#xff08; &#xff09;。 A.01101 B.11001 C.001101 D.011001 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的…

牛客周赛 Round 3 解题报告 | 珂学家 | 贪心思维场

前言 寒之不寒无水也&#xff0c;热之不热无火也。 整体评价 感觉比较简单&#xff0c;更加侧重于思维吧。和前几场的Round系列&#xff0c;风格不太一样。 A. 游游的7的倍数 因为连续7个数&#xff0c;比如有一个数是7的倍数 因此从个位数中着手添加&#xff0c;是最好的选…

软件测试|如何使用Selenium处理隐藏元素

简介 我们在使用selenium进行web自动化测试时&#xff0c;有时候会遇到元素被隐藏&#xff0c;从而无法对元素进行操作&#xff0c;导致我们的用例报错的情况。当我们遇到元素被隐藏的情况时&#xff0c;需要先对隐藏的元素进行处理&#xff0c;才能继续进行我们的操作&#x…