linux:TCP(传输控制协议)1、客户端和服务器连接并通信客户端,向服务器发送数据2、实现回传。服务器收到客户端的数据之后,将数据返传给客户端

2023-11-05

注意:服务器中的ip(192.168.31.122)和端口号port(6666)客户端中必须一致

编译:客户端:gcc tcp_client.c -o client

          服务器:gcc tcp_server.c -o server
运行:客户端:./client

          服务器:./server 192.168.31.122  6666

客户端:

tcp_client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

#define SIZE 64

int main(int argc, char *argv[])
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建网络通信接口
    if(-1 == sockfd)
    {
        perror("socket");
        return -1;
    }

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

    
    struct sockaddr_in saddr;//服务器的地址结构
    bzero(&saddr,sizeof(saddr));//memset()
    saddr.sin_family = AF_INET;//指定协议族ipv4 
    saddr.sin_port = htons(6666);//端口号:5001~65535 
    saddr.sin_addr.s_addr = inet_addr("192.168.31.122");//ip地址 点分式 -> 二进制网络字节序


    int ret = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));//绑定 将服务器的ip和port与sockfd绑定
    if(-1 == ret)
    {
        perror("connect");
        close(sockfd);
        return -1;
    }
    printf("connect success\n");

    //通信
    char buf[SIZE] = {0};

    do{
        fgets(buf,sizeof(buf),stdin);//标准输入获取字符串
        ret = write(sockfd,buf,sizeof(buf));//给服务器写请求
        if(-1 == ret)
        {
            perror("write");
            break;
        }

        bzero(buf,sizeof(buf));
        ret = read(sockfd, buf, sizeof(buf));//读取服务器回传的内容
        if(-1 == ret)
        {
            perror("read");
            break;
        }
      printf("buf:%s\n",buf);   
    }
    while(strncmp(buf,"quit",4) != 0);

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

    close(sockfd);

    return 0;

服务器

tcp_server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define SIZE 64

int server_init(char *ipaddr, unsigned short port, int backlog)
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建网络通信接口
    if(-1 == sockfd)
    {
        perror("socket");
        return -1;
    }

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

    
    struct sockaddr_in saddr;//服务器的地址结构
    bzero(&saddr,sizeof(saddr));//memset()
    saddr.sin_family = AF_INET;//指定协议族ipv4 
    saddr.sin_port = htons(port);//端口号:5001~65535 
    saddr.sin_addr.s_addr = (ipaddr == NULL)? htonl(INADDR_ANY) : inet_addr(ipaddr);//ip地址 点分式 -> 二进制网络字节序


    int ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));//绑定 将服务器的ip和port与sockfd绑定
    if(-1 == ret)
    {
        perror("bind");
        close(sockfd);
        return -1;
    }
    //printf("bind success\n");

    ret = listen(sockfd, backlog);//监听是否有客户端请求连接 sockfd:监听套接字
    if(-1 == ret)
    {
        perror("listen");
        close(sockfd);
        return -1;
    }

    return sockfd;
}

int main(int argc, char *argv[])
{
    if(argc < 3)
    {
        printf("Usage:%s <ip> <port>\n",argv[0]);
        return -1;
    }
    int sockfd = server_init(argv[1], atoi(argv[2]), 1024);
    if(-1 == sockfd)
    {
        printf("server_init error\n");
        return -1;
    }
    printf("listen....\n");

    struct sockaddr_in caddr;//保存客户端的信息(ip port protocol)
    bzero(&caddr, sizeof(caddr));
    socklen_t clen = sizeof(caddr);

    //rws:用于服务器和连接的客户端通信
    int rws = accept(sockfd, NULL, NULL);//阻塞等待客户端请求连接
    if(-1 == rws)
    {
        perror("accept");
        close(sockfd);
        return -1;
    }

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

    //通信
    char buf[SIZE] = {0};

do{
        bzero(buf, sizeof(buf));
        int ret = recv(rws,buf,sizeof(buf),0);//读客户端消息
        if(-1 == ret)
        {
            perror("recv");
            break;
        }
        else if(0 == ret)//表示客户端关闭
        {
            printf("client closed\n");
            return -1;
        }
        
    //回传消息给客户端
        ret = send(rws,buf,sizeof(buf),0);
        if(-1 == ret)
        {
            perror("send");
            break;
        }

    }
while(strncmp(buf,"quit",4)!=0);
    if(-1 == close(rws))
    {
}

    close(sockfd);

    return 0;

运行结果: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux:TCP(传输控制协议)1、客户端和服务器连接并通信客户端,向服务器发送数据2、实现回传。服务器收到客户端的数据之后,将数据返传给客户端 的相关文章

  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • Linux >2.6.33:可以使用 sendfile() 来实现更快的“猫”吗?

    必须将大量大文件连接成一个更大的单个文件 我们目前使用 cat file1 file2 output file but are wondering whether it could be done faster than with that
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你

随机推荐

  • shell脚本基础3——正则表达式

    文章目录 一 基本了解 二 基本正则表达式 2 1 字符匹配 2 2 位置锚定 2 3 匹配次数 2 4 分组 三 扩展正则表达式 3 1 字符匹配 3 2 位置锚定 3 3 匹配次数 3 4 分组 3 5 或者 一 基本了解 正则表达式分
  • 对表的简单查询

    SQL命令对表进行查询 目录 SQL命令对表进行查询 1 无条件查询 2 条件查询 3 统计汇总查询 4 分组查询 5 对查询结果排序 1 无条件查询 无条件查询指只包含 SELECT FROM 的查询 这种查询最简单 例如 在S表中查询所
  • Android Studio安装中的问题及第一次运行hello world程序

    总结一下 在安装Android Studio中可能出现和遇到的问题 并给出解决方案 1 AS在安卓官网可以直接下载完整的安装包 2 SDK找不到的情况 可以自己下载 参考 https www jianshu com p 4ac1313b50
  • 自定义动态数据源

    文章目录 准备 业务流程分析 代码实现 网页上切换数据源 准备 mysql spring boot 配置依赖 配置文件 数据源配置 spring datasource type com alibaba druid pool DruidDat
  • UnityVR--小程序3--金色的子弹2

    子弹需要一个打击目标 目标具备一定的生命值 HP 当生命值将为0时 目标被击落并消失 1 前篇的AXButton cs脚本不需要修改 2 子弹的程序Bullet cs中 OnTriggerEnter Collider other 函数修改为
  • 肖战

    肖战是中国内地男演员 歌手 主持人 毕业于中央戏剧学院表演系 他曾出演过多部影视剧 包括 花千骨 武媚娘传奇 和 长安十二时辰 此外 他还是一位多才多艺的歌手 曾发行过多张个人音乐专辑
  • 苹果开发平台常用网址链接

    苹果开发者中心 https developer apple com cn 苹果开发者中心 企业类型 https developer apple com cn programs enterprise 注册账号 https developer
  • react+antd实现Table拖拽调整列宽

    注意 列需要传入 width 并且配合下面的css样式才能显示拖拽手势 import React useEffect useState from react import Table from antd import Resizable f
  • PE半透明屏是怎么制造的?工艺、材料、应用

    PE半透明屏是一种新型的屏幕材料 具有半透明的特点 它由聚乙烯 PE 材料制成 具有良好的透明度和柔韧性 PE半透明屏广泛应用于建筑 广告 展览等领域 具有很高的市场潜力 PE半透明屏的特点之一是其半透明性 它可以在一定程度上透过光线 使得
  • 相关性分析热力图(Python&Matlab代码实现)

    目录 1 热力图 1 1 简介 1 2 语法 2 算例1 Python代码实现 2 1 算例 2 2 Python代码 2 3 运行结果 3 算例2 Python代码实现 4 算例3 Python代码实现 4 1 算例 4 2 Python
  • 小电容通高频大电容通低频的理解

    本文参考为什么电容通高频阻低频 记录下个人理解并总结 1 电容的作用是通高频阻低频 高频的时候电容总是还没充满电 负半周期便到来 所以电流始终存在 低频的时候信号交流电负半周还没到来 电容已充满电便发生断路 2 理论上电容越大 能通越高的高
  • 简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)

    科普 同步和异步的区别 同步和异步是指程序执行的方式 其中同步指程序按顺序执行 每个任务必须等待前面的任务执行完成后才能执行 而异步则指程序可以在执行一个任务时同时执行另一个任务 不需要等待前一个任务执行完毕 同步 Synchronous
  • supervisor源码分析

    Supervisor分析 1 运行原理概述 Supervisor生成主进程并将主进程变成守护进程 supervisor依次生成配置文件中的工作进程 然后依次监控工作进程的工作状态 并且主进程负责与supervisorctl客户端通信 实现主
  • c语言中求三个整数中的最大值和最小值,编程用指针实现输入三个整数,求其中的最大值...

    公告 为响应国家净网行动 部分内容已经删除 感谢读者理解 话题 编程用指针实现输入三个整数 求其中的最大值回答 include stdio h int getmax int p int n int i max p max p p 0 for
  • C++ 多线程 学习笔记

    线程睡眠很稳定 但无线程睡眠不稳定 线程调用类方法 有参数时调用方法 当参数为引用时 detach分离线程 分离线程与主线程同时进行 join会使主线程挂起 执行join进来的进程 detach必须让主线程在还住运行的情况下调用 换句话说就
  • harbor数据库迁移

    harbor数据库迁移 相同版本间迁移 一 数据导出 旧harbor机 1 进入数据库容器 root localhost docker exec u root it d53efe26b3da bin bash 2 导出registry数据库
  • KafkaConsumer-Kafka从入门到精通(十)

    上篇文章说了 消息压缩可以看分情况进行 判断下服务器cpu空闲还是io空闲较多 如果cpu空闲较多 则考虑消息积压 反之则不考虑 还有消费者组 consumer group 对于同一个group 只会发送一条消息进入一个实例 位移提交在0
  • php中mail,php中mail()函数和SMTP工作原理及实际

    php中mail 函数和SMTP工作原理及实际 发表于2019 05 24 12 36 次阅读 来源网络整理 作者session 摘要 php中mail 函数和SMTP工作原理及实际 php中mail 函数和SMTP工作原理及实际 一个发送
  • C++利用zxing识别二维码

    C 利用zxing识别二维码 下载编译 配置使用 Win10 x64 VS2015 VS2019 下载编译 1 下载zxing包 并解压 下载地址 https github com glassechidna zxing cpp build文
  • linux:TCP(传输控制协议)1、客户端和服务器连接并通信客户端,向服务器发送数据2、实现回传。服务器收到客户端的数据之后,将数据返传给客户端

    注意 服务器中的ip 192 168 31 122 和端口号port 6666 客户端中必须一致 编译 客户端 gcc tcp client c o client 服务器 gcc tcp server c o server 运行 客户端 c