在Linux系统实现服务器端和客户端的套接字通信

news2024/11/30 0:44:42

目录

一.创建一个socket文件夹用来存放编写的服务器端和客户端程序

二.编写服务器端代码

三.编写客户端代码

四.编译c语言程序

五.断开连接

六.可能涉及到的一些没接触过的知识点

一.创建一个socket文件夹用来存放编写的服务器端和客户端程序

(我系统里的文件在temp/socket$文件夹中)

 

二.编写服务器端代码

vim server.c

在server.c中编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>//提供IP地址转换函数

int main()
{
    //1.创建监听的套接字
    int fd = socket(AF_INET,SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");//perror(s) 用来将上一个函数发生错误的原因输出到标准设备,参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
        return -1;
    }

    //2.绑定本地的IP port
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;//地址族协议
    saddr.sin_port = htons(9999);//端口必须转换成大端
    saddr.sin_addr.s_addr = INADDR_ANY;//指定IP地址(INADDR_ANY泛指本机的意思,也就是表示本机的所有IP)
    int ret = bind(fd, (struct sockaddr*)&saddr, sizeof(saddr));
    if (ret == -1)//绑定失败 返回-1
    {
        perror("bind");
        return -1;
    }
    //3设置监听
    ret = listen(fd, 128);
    if (ret == -1)
    {
        perror("listen");
        return -1;
    }
    //4阻塞并等待客户端的连接
    struct sockaddr_in caddr;
    int addrlen = sizeof(caddr);
    int cfd = accept(fd, (struct sockaddr*)&caddr,&addrlen );
    if (cfd == -1)
    {
        perror("accept");
        return -1;
    }
    //连接建立成功,打印客户端的IP和端口信息
    char ip[32];
    printf("客户端的ip:%s,端口:%d\n",
        inet_ntop(AF_INET, &caddr.sin_addr.s_addr, ip, sizeof(ip)), ntohs(caddr.sin_port));//网络字节序转换为主机字节序
   
    //5.通信
    while (1)
    {
        //接收数据
        char buff[1024];
        int len = recv(cfd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            printf("client say: %s\n", buff);
            send(cfd, buff, len, 0);
        }
        else if (len == 0)
        {
            printf("客户端已经断开了连接...\n");
            break;
        }
        else
        {
            perror("recv");
            break;
        }
    }
    //关闭文件描述符
    close(fd);
    close(cfd);
    return 0;
}

三.编写客户端代码

vim client.c

在client中编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>//提供IP地址转换函数

int main()
{
    //1.创建通信的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");//perror(s) 用来将上一个函数发生错误的原因输出到标准设备,参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
        return -1;
    }

    //2.连接服务器IP port
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;//地址族协议
    saddr.sin_port = htons(9999);//端口必须转换成大端
    inet_pton(AF_INET, "192.168.122.1 ", &saddr.sin_addr.s_addr);
    int ret = connect(fd, (struct sockaddr*)&saddr, sizeof(saddr));
    if (ret == -1)//连接失败 返回-1
    {
        perror("connect");
        return -1;
    }
    
    int number = 0;
    //3.通信
    while (1)
    {
        //发送数据
        char buff[1024];
        sprintf(buff, "你好,hello ,world ,%d...\n", number++);
        send(fd, buff, strlen(buff) + 1, 0);
        //接收数据
        memset(buff, 0, sizeof(buff));
        int len = recv(fd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            printf("server say: %\n", buff);

        }
        else if (len == 0)
        {
            printf("服务器端已经断开了连接...\n");
            break;
        }
        else
        {
            perror("recv");
            break;
        }
        sleep(1);
    }
    //关闭文件描述符
    close(fd);
    return 0;
}

四.编译c语言程序

[itliang@localhost socket]$ gcc client.c -o client
[itliang@localhost socket]$ gcc server.c -o server

 运行server.c程序,先运行服务器端再运行客户端

 运行client.c程序,至此客户端与服务器端建立通信,客户端收到服务器端消息,并输出“你好,hello,world”

 

 服务器端收到客户端消息,并输出“你好,hello,world”

 五.断开连接

当服务器端断开连接时,客户端会显示“服务器端已经断开了连接”

 当客户端断开连接时,服务器端会显示“客户端已经断开了连接”

 

 六.可能涉及到的一些没接触过的知识点

perror(s)函数

        用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下:

 

GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc、g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar、nm 等。

        GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C、Pascal、Fortran、Java、Ada 等语言均能进行编译。GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86、ARM、PowerPC、mips 等,以及 Linux、Windows 等软件平台。
        有些纯净版的 Linux 默认没有 gcc 编译器,需要自己安装,在线安装步骤如下:

# 安装软件必须要有管理员权限
# ubuntu
$ sudo apt update           # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo apt install gcc g++    # 通过下载列表中提供的地址下载安装包, 并安装

# centos
$ sudo yum update           # 更新本地的软件下载列表, 得到最新的下载地址
$ sudo yum install gcc g++    # 通过下载列表中提供的地址下载安装包, 并安装
gcc 安装完毕之后,可以查看版本:


# 查看 gcc 版本
$ gcc -v
$ gcc --version

# 查看 g++ 版本
$ g++ -v
$ g++ --version

编译:

# 参数 -c 是进行文件的汇编, 汇编之前的两步会自动执行
$ gcc test.c -c -o app.o

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

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

相关文章

Revit楼板问题:楼板连接处以及楼板开洞,一键开洞

在我们做楼梯时&#xff0c;楼梯与楼板处的连接处理不是那么符合实际&#xff0c;会出现一些问题&#xff0c;如下图&#xff0c;这样的连接会导致楼梯配筋时钢筋外露。 我们来学习如何调节楼板与楼板连接处的高度&#xff0c;选中楼梯&#xff0c;点击“编辑楼梯”在所需要更改…

STM32堆栈方面知识点

最近弄json&#xff0c;发现经常的堆溢出&#xff0c;然后找问题。因为对STM32堆栈问题没有深刻认识&#xff0c;就花时间好好研究下了堆栈并且做了验证 1.栈地址区间确定 首先找到启动文件&#xff0c;我的启动文件在startup_stm32f40xx.s&#xff0c;一般的启动文件也都在s…

Linux之命令搜索

目录 Linux之命令搜索 Whereis命令 定义 基本信息 举例 which命令 定义 与whereis命令的区别 基本信息 举例 locate 命令 定义 优点 缺点 基本信息 案例 Linux之命令搜索 Whereis命令 定义 whereis --- 搜索系统命令的命令&#xff08;像绕口令一样&#xff09…

Revit中如何为曲面墙体开洞口,一键开洞?

一、Revit中如何为曲面墙体开洞口 直线墙体开洞可以直接通过编辑轮廓来绘制洞口形状即可&#xff0c;或者可以通过选中墙体选择“墙-洞口”命令来开洞口。 但是曲面墙体开洞并没有那么简单&#xff0c;曲面墙体不能够编辑轮廓&#xff0c;并且选中曲面墙体“墙-洞口”命令只能够…

C++const函数的运用:深度解析const函数的魅力

C 深度解析const函数的魅力 1. C const函数的基本概念&#xff08;Basic Concepts of const Functions in C&#xff09;1.1 const函数的定义与特性&#xff08;Definition and Characteristics of const Functions&#xff09;1.2 const函数的使用场景&#xff08;Usage Scena…

docker磁盘空间爆满 通过overlay2 目录名查找对应容器

docker磁盘空间爆满 通过overlay2 目录名查找对应容器 1、docker文件系统占用分析2、使用shell脚本通过overlay2 目录名查找对应容器 1、docker文件系统占用分析 du -sh /var/lib/docker/*看到占用磁盘空间最大的目录是docker存储根目录下的overlay2目录 再查看docker存储根目…

Android智能指针SP WP

1.概述 Android的C部分代码中有大量的sp/wp存在&#xff0c;意思是strong pointer和weak pointer&#xff0c;看字面意思就是指针相关的东西。C是通过new和delete进行内存的分配和释放的&#xff0c;但是有时候开发者会忘记使用delete导致内存泄露&#xff0c;所以Android中就…

设计师们都在用的AI作图神器,你还不抓紧入手一款

人工智能在机器和计算机控制的机器人中模拟人类智能过程。这允许计算机系统执行繁重的任务&#xff0c;帮助人类专注于更重要的事情。因此&#xff0c;多年来&#xff0c;工作场所对 AI 集成的需求不断增加。 同样&#xff0c;人工智能正迅速成为设计行业的一部分。在平面设计…

MyBatis与Spring的整合

学习目标&#xff1a; 掌握Spring与MyBatis的集成 掌握使用SqlSessionTemplate实现整合 掌握使用MapperFactoryBean实现整合 掌握Spring的事务切面实现声明式事务处理 掌握使用注解实现声明式事务处理 学习内容&#xff1a; 1.整合思路梳理 思路梳理 以上流程可以全部移…

RHCE 作业二

1. 第一步&#xff1a;配置服务端server 1>安装chrony [rootserver ~]# yum install chrony -y 2>编辑配置文件&#xff0c;修改为阿里的时间服务地址 [rootserver ~]# vim /etc/chrony.conf 3> 重启服务 [rootserver ~]# systemctl restart chronyd 4>测试 5>…

证件照制作教程:如何使用在线工具制作高质量的证件照

证件照制作&#xff1a;让你的形象更加完美 介绍 证件照是人们在日常生活、工作和学习中必不可少的一项证明身份的重要文件。而证件照的质量好坏不仅会直接影响到证件审核的效率&#xff0c;还会影响到自己形象的好坏。为了让自己的形象更加完美&#xff0c;我们需要制作高质…

公网使用SSH远程连接安卓手机Termux - Android手机服务器

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 转载自cpolar极点云的文章&#xff1a;公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不…

Python期末复习题库(下)——“Python”

小雅兰期末加油冲冲冲&#xff01;&#xff01;&#xff01; 1. (单选题)下列关于文件打开模式的说法,错误的是( C )。 A. r代表以只读方式打开文件 B. w代表以只写方式打开文件 C. a代表以二进制形式打开文件 D. 模式中使用时,文件可读可写 2. (单选题)下列选项中,以追加…

【操作系统】04.设备管理

IO软件层次 IO设备 机械部件 分类 设备控制器 寄存器编址 IO控制方式 程序直接控制方式 中断驱动方式 DMA方式 通道控制方式 中断处理程序 设备驱动程序 设备独立性软件 IO调度 设备保护 设备分配与回收 静态分配和动态分配 数据结构 设备分配步骤 改进 缓冲区管理 缓冲区的…

5款冷门小工具,让你的电脑变得与众不同

每个人的电脑中都会安装很多软件&#xff0c;可能还保留着很多不为人知的冷门软件。不过虽然冷门&#xff0c;但绝不意味着低能&#xff0c;相反很多冷门软件的功能十分出色。闲话少说&#xff0c;接下来我就给大家推荐5款冷门小工具&#xff0c;看一看有没有你喜欢的。 1.图标…

供应商评估时要考虑的 5 个关键因素

在任何供应商评估中&#xff0c;无论是新供应商还是现有供应商&#xff0c;衡量其生产能力、业绩、风险、质量和环境影响都很重要。然而&#xff0c;如果没有一个有组织的评估方法和一个较大的框架来使评估信息为你所用&#xff0c;单靠衡量这些因素将无济于事。 为什么要进行…

跨部门沟通:这8条方法和建议,让跨部门协作不再难搞!

想要在公司里做出成绩&#xff0c;跨部门沟通是至关重要的。但是&#xff0c;很多人都会遭遇跨部门协作困难的问题。别担心&#xff0c;我们来给你解决方案&#xff01; 1.保持开放和透明 让你的队友们知道你的想法和工作计划&#xff0c;让他们能够对你提出反馈意见。 2.要…

点成分享丨ELISA实验的类型及原理

ELISA实验&#xff0c;即酶联免疫吸附测定&#xff08;Enzyme-Linked Immunosorbent Assay&#xff09;实验&#xff0c;是免疫学中的经典实验之一&#xff0c;它是一种利用抗原抗体特异性结合进行免疫反应的定性和定量检测方法&#xff0c;目前已被广泛应用于生物学、医学、植…

ai语音机器人接听自动外呼配置

一&#xff0c;添加能转接到机器人的拨号方案 {cti_robot_flow_exists({destination_number})} 这是判断路由条件设置的机器人话术是否存在 cti_robot ${destination_number} 启动机器人流程 set park_timeout3600 设置park最大的时间&#xff0c;机器人和用户最大的通话时间…

ChatGPT智能聊天系统重磅升级!新增分销功能!快来体验吧!

ChatGPT智能聊天系统更新至v1.1.2版本啦~主要更新内容如下&#xff1a; 新增功能 注册账号 生成对话海报 分销功能 支持小程序 会员功能控制 敏感词库 用户支持加入黑名单 后台-用户列表新增用户开通会员的筛选 细节优化 对话内容markdown渲染 用户条数用完&#xf…