Linux系统下通过TCP与UDP方式建立简易的客户端与服务器之间的连接

2023-10-31

TCP方式

  1. 服务器函数

#include "head.h"
#define IP "192.168.31.38"
#define PORT 2023
int main(int argc, const char *argv[])
{    
    //创建套接字socket
    int sfd = socket(AF_INET,SOCK_STREAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    fprintf(stderr,"socket sceeuss\n");


    //完善服务器信息struct sockaddr_in 
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    //绑定端口以及IP bind
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    fprintf(stderr,"bind sceeuss\n");

    //将套接字设置为被动监听状态listen
    if(listen(sfd,128)<0)
    {
        ERR_MSG("listen");
        return -1;
    }
    fprintf(stderr,"listen sceeuss\n");

    //获取连接成功后的套接字accept
    //阻塞函数,等待客户端连接成功,并生产一个新的文件秒速符
    //定义结构体,存储客户端的地址信息
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    int newsfd_1 = -1;
    newsfd_1 = accept(sfd,(struct sockaddr*)&cin,&addrlen);
    if(newsfd_1<0)
    {
        ERR_MSG("accept");
        return -1;
    }
    fprintf(stderr,"accept sceeuss\n");


    char buf[128] = "";
    ssize_t res;
    while(1)
    {
    bzero(buf,sizeof(buf));
    //接收客户端的信息recv
    res = recv(newsfd_1,buf,sizeof(buf),0);
    if(res<0)
    {
        ERR_MSG("recv");
        return -1;
    }
    else if(0==res)
    {
        fprintf(stderr,"k=客户端断开连接\n");
    }
    fprintf(stderr,"recv sceeuss\n");

    //向客户端发送信息send
    bzero(buf,sizeof(buf));
    strcpy(buf,"sceeuss");
    if(send(newsfd_1,buf,sizeof(buf),0)<0)
    {
        ERR_MSG("send");
        return -1;
    }
    fprintf(stderr,"send sceeuss\n");
    }


    //关闭套接字
    close(sfd);
    close(newsfd_1);
    return 0;
}
  1. 客户端的函数

#include "head.h"
#define PORT 2023
#define CLI_PORT 2024
#define IP "192.168.31.38"
int main(int argc, const char *argv[])
{
    //创建套接字
    int cfd = socket(AF_INET,SOCK_STREAM,0);
    if(cfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    fprintf(stderr,"socket sccuess\n");

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    //不用绑定IP与端口
    //连接服务器
    if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("connect");
        return -1;
    }
    fprintf(stderr,"connect sccuess\n");


    char buf[128] = "";
    ssize_t res;
    printf("请输入传输的数据:\n");
    while(1)
    {    
    //发送信息
    bzero(buf,sizeof(buf));
    scanf("%s",buf);
    if(0==strcmp(buf,"quit"))
    {
        fprintf(stderr,"客户端退出\n");
        return -1;
    }
    if(send(cfd,buf,sizeof(buf),0)<0)
    {
        ERR_MSG("send");
        return -1;
    }
    fprintf(stderr,"send sccuess\n");

    
    //接受服务器信息
    res = recv(cfd,buf,sizeof(buf),0);
    if(res<0)
    {
        ERR_MSG("recv");
        return -1;
    }
    else if(0==res)
    {
        fprintf(stderr,"服务器退出\n");
    }
    fprintf(stderr,"recv sccuess\n");

    }

UDP方式

  1. 服务器函数

#include "head.h"
#define IP "192.168.31.38"
#define PORT 6666
int main(int argc, const char *argv[])
{
    //创建套接字 socket
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    fprintf(stderr,"socket sceeuss\n");

    //填充服务器自身的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    socklen_t addrlen = sizeof(sin);
    //绑定IP以及端口 bind
    if(bind(sfd,(struct sockaddr*)&sin,addrlen)<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    fprintf(stderr,"bind sceeuss\n");


    char buf[128]="";
    struct sockaddr_in cin;
    socklen_t addrlen_c = sizeof(cin);
    while(1)
    {
    bzero(buf,sizeof(buf));

    //接受recvfrom
    ssize_t res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen_c);
    if(res<0)
    {
        ERR_MSG("recvfrom");
        return -1;
    }
    else if(0==res)
    {
        fprintf(stderr,"客户端已关闭\n");
        return -1;
    }
    if(0==strcmp(buf,"quit"))
    {
        fprintf(stderr,"客户端退出\n");
    }
    else
    {
    printf("连接成功\n");
    }
    printf("ser=%s\n",buf);
//    fprintf(stderr,"recvfrom sceeuss\n");



    //发送sendto
    strcat(buf,"***");
    if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,addrlen_c)<0)
    {
        ERR_MSG("sendto");
        return -1;
    }
//    fprintf(stderr,"sendto sceeuss\n");
    }
    //关闭套接字 close
    close(sfd);
    return 0;
}
  1. 客户端函数

#include "head.h"
#define IP "192.168.31.38"
#define PORT 6666
#define CLI_PORT 7777
int main(int argc, const char *argv[])
{
    //创建套接字 socket
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    fprintf(stderr,"socket sceeuss\n");

    //填充客户端自身的地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CLI_PORT);
    cin.sin_addr.s_addr = inet_addr(IP);

    socklen_t addrlen_c = sizeof(cin);
    //绑定IP以及端口 bind
    //如果不绑定 操作系统会自动绑定本机IP,随机使用一个
    
    if(bind(sfd,(struct sockaddr*)&cin,addrlen_c)<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    
//    fprintf(stderr,"bind sceeuss\n");
    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]="";
    socklen_t addrlen = sizeof(sin);    

    //存储客户端发过来的数据
    struct sockaddr_in recvaddr;
    socklen_t recvlen = sizeof(recvaddr); 

    while(1)
    {
    bzero(buf,sizeof(buf));
    printf("请输入数据:\n");
    scanf("%s",buf);
    //发送sendto
    if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,addrlen)<0)
    {
        ERR_MSG("sendto");
        return -1;
    }
    if(0==strcmp(buf,"quit"))
    {
        fprintf(stderr,"客户端退出\n");
        return -1;
    }
//    fprintf(stderr,"sendto sceeuss\n");
    
    //接受recvfrom
    ssize_t res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&recvaddr,&recvlen);
    if(res<0)
    {
        ERR_MSG("recvfrom");
        return -1;
    }
    else if(0==res)
    {
        fprintf(stderr,"服务器已关闭\n");
        return -1;
    }
//    fprintf(stderr,"recvfrom sceeuss\n");
    printf("cli=%s\n",buf);
    }
    //关闭套接字 close
    close(sfd);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统下通过TCP与UDP方式建立简易的客户端与服务器之间的连接 的相关文章

  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack

随机推荐

  • windows文件保护服务器,Windows 文件保护功能的说明

    WFP 功能的工作方式 WFP 功能使用两种机制为系统文件提供保护 第一种机制在后台运行 在 WFP 收到受保护目录中的文件的目录更改通知后 就会触发这种保护机制 WFP 收到这一通知后 就会确定更改了哪个文件 如果此文件是受保护的文件 W
  • 深度学习十大框架比较

    框架比较 转 1 TensorFlow 对于那些听说过深度学习但还没有太过专门深入的人来说 TensorFlow 是他们最喜欢的深度学习框架 但在这里我要澄清一些事实 在 TensorFlow 的官网上 它被定义为 一个用于机器智能的开源软
  • Deeplabcut教程(一)安装(GPU&CPU版本)(纯新人向)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Deeplabcut是什么 二 使用步骤 1 环境配置 1 1安装anaconda 1 2换源 1 2安装CUDA和CUdnn GPU 2 Deeplab
  • C++类的继承与派生

    一 基本概念 1 类的继承 是新的类从已有类那里得到已有的特性 或从已有类产生新类的过程就是类的派生 原有的类称为基类或父类 产生的新类称为派生类或子类 2 派生类的声明 class 派生类名 继承方式 基类名1 继承方式 基类名2 继承方
  • 罗技键盘蓝牙搜不到

    罗技K580蓝牙键盘 长按F11 F12在macbookpro 搜索不到 首先 按一下 fn esc 然后长按F11 F12 就可以搜到了
  • 从0开始搭建react项目

    一 项目创建 插件安装 前端项目的创建有三种方式 参考https juejin cn post 6844903953524588552 在html中引入react react dom Babel 使浏览器识别JSX语法 等 使用官方脚手架c
  • Missing variable is:CMAKE_CUDA_DEVICE_LINK_EXECUTABLE

    Linux平台下使用CMAKE3 10 2与CUDA10 2混合编程时出现错误 Missing variable is CMAKE CUDA DEVICE LINK EXECUTABLE 根据https github com colmap
  • 如何遍历一个对象所有的属性并判断属性值

    最近的项目里的一个需求 要我判断一个对象里的所有属性 是否存在值不是 或是null的 public boolean checkGoodMode List
  • 服务器物理内存稳定90%多,服务器物理内存使用率90以上

    服务器物理内存使用率90以上 内容精选 换一换 系统每30秒周期性检测HDFS服务直接内存使用状态 当检测到DataNode实例直接内存使用率超出阈值 最大内存的90 时 产生该告警 直接内存使用率小于阈值时 告警恢复 DataNode可用
  • android自定义圆环控件 滑动选择百分比

    之前做了一个聊天应用 其中需要一个圆环控件 滑动可以选择百分比 看效果图 这个自定义view可以分几步完成 画绿色圆环 画灰色圆环 画三角形 画百分比 其中三角形围绕环形旋转 采用Path类实现 首先画出基本的三角形路径 而后适当计算一下
  • 构造函数及复制构造函数

    一 构造函数 是为了让我们自己去规定 我们定义对象的初始化 这里给出一段程序 作用是按格式输出 输入的时间 include
  • 小型水库雨水情测报及大坝安全监测系统

    一 方案背景 我国水库众多 水库在带给人们便利的同时也存在着巨大的安全隐患 对大坝安全监测的要求越来越高 一旦溃坝失事 会对生命 财产 基础设施 生态环境 经济社会发展等造成灾难性破坏 大坝安全关系着公共安全 经济安全和国家安全 更是水库安
  • R手册--目录

    R手册 说明 本手册所列包基本来自AwesomeR 结合 GitHub 和help package pk name 官方文档整理所得 有助于使用时下最实用的包对R进行深入的学习 致谢 ApacheCN 中文开源组织 致力于官方文档及AI书籍
  • Mac电脑快速安装apt-get

    最近在mac上安装环境和工具 发现以前习惯的apt get者mac上是没有的 所以查了资料 找了一个简单靠谱的方式 1 下载 首先下载前置环境x11 1 双击XQuartz 2 7 8 dmg 安装fink的前置环境X11 2 安装完之后
  • 28、认证

    认证技术 认证 Authentication 又称鉴别或确认 是证实某事是否名副其实或是否真实有效的一个过程 加密 确保信息的机密性 阻止对手的被动攻击 如截取 窃听等 认证技术 完整性 放抵赖 防篡改 确保报文发送者和接收者的真实性以及报
  • UVSLED透明屏,在商业广告中,有哪些应用表现?

    UVSLED透明屏是一种新型的显示屏技术 它采用了UVSLED Ultraviolet Shortwave Light Emitting Diode 作为光源 具有高亮度 高对比度和高色彩饱和度的特点 UVSLED透明屏可以实现透明显示效果
  • vue的监听select的事件

  • webpack发布

    当我们项目开发完成后 需要发布上线 而我们通过webpack dev server的插件打包的文件是存在于内存上的 物理磁盘上并不存在 所以我们需要将内存中的项目复制一份到物理磁盘上 方法 在package json文件中的scripts中
  • 计算机英语学习笔记&深度学习

    学习资料来源于 Robust Face Recognition via Multimodal Deep Face Representation Changxing Ding Student Member IEEE Dacheng Tao F
  • Linux系统下通过TCP与UDP方式建立简易的客户端与服务器之间的连接

    TCP方式 服务器函数 include head h define IP 192 168 31 38 define PORT 2023 int main int argc const char argv 创建套接字socket int sf