C语言实现TCP服务器与客户端通信

2023-05-16

         以上是TCP通信客户端与服务器实现通信的基本原理流程图。

1、客户端的实现(4个步骤)

1.1创建socket对象

1.2请求连接

1.3发送数据

1.4关闭套接字

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

int main(int argc,char *argv[])
{
    //入参判断
    if(argc < 2)
    {
        printf("参数有误");
        return -1;
    }
    //1.创建socket对象(流式套接字)
    //2.设置服务器端的ip地址和接口
    //3.请求连接
    //4.发送数据
    //5.关闭socket对象
    
    //1.创建socket对象(流式套接字)
    int tcp_socket = socket(AF_INET,SOCK_STREAM,0);
    if(tcp_socket < 0)
    {
        perror("socket error");
        return -1;
    }

    //1.1设置服务器端的ip地址和端口号
    //定义结构体并为其赋值
    struct sockaddr_in server;
    server.sin_family = AF_INET;//IPV4协议
    server.sin_port = htons(atoi(argv[2]));//端口号
    server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序

    //2.请求连接
    if(connect(tcp_socket,(struct sockaddr *)&server,sizeof(server)) < 0)
    {
        perror("connect error");
        return -1;
    }

    //3.发送消息
    char buf[20] = {0};
    printf("tftp>");
    fgets(buf,sizeof(buf),stdin);//从键盘写入数据到缓冲区
    send(tcp_socket,buf,strlen(buf),0);//将缓冲区的数据写入socket
    //4关闭socket对象
    close(tcp_socket);
    return 0;
}

提示:ip地址和端口号均采用主函数传参的方式输入。加入步骤3的目的是为了用发送消息的方式检验是否能正常通信。具体的每个函数中所用到的参数就不做详细的介绍了可利用(man 函数名)的方式查询。

2. 服务器的实现(6个步骤)

2.1创建socket对象

2.2绑定套接字

2.3启动监听

2.4接收连接请求

2.5接收客户端数据

2.6关闭socket对象

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

int main(int argc,char *argv[])
{
    //入参判断
    if(argc < 3)
    {
        printf("参数有误");
        return -1;
    }
    //1.创建socket对象(流式套接字)    socket()
    //2.设置服务器端的ip地址和端口号  struct sockaddr_in
    //3.绑定自己的ip地址和端口号      bind()
    //4.监听socket对象                listen()
    //5.接受连接                      accept()
    //6.接受连接后进行操作
    //7.关闭socket对象                close()
    
    //1.创建socket对象(流式套接字)
    int socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if(socket_fd < 0)
    {
        perror("socket error");
        return -1;
    }

    //1.1设置服务器端的ip地址和端口号
    //定义结构体并为其赋值
    struct sockaddr_in server;
    server.sin_family = AF_INET;//IPV4协议
    server.sin_port = htons(atoi(argv[2]));//端口号
    server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序

    //2.绑定自己的ip地址和端口号
    if(bind(socket_fd,(struct sockaddr *)&server,sizeof(server)) < 0)
    {
        perror("bind error");
        return -1;
    }

    //3.监听socket对象
    int ret = listen(socket_fd,5);
    if(ret < 0)
    {
        perror("listen error");
        return -1;
    }

    //4.接收连接
    int newfd =  0;//接收新的socket对象
    struct sockaddr_in client;
    int len = sizeof(client);
    newfd = accept(socket_fd,(struct sockaddr *)&client,&len);//通过参数2 获得客户端信息
    if(newfd < 0)
    {
        perror("accept error");
        return -1;
    }
    //输出客户端信息
    printf("cilent ip=%s port=%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

    //5.接收数据
    char buf[20] = {0};
    recv(newfd,buf,sizeof(buf),0);
    printf("%s\ny",buf);
    //6.关闭socket对象
    close(newfd);

提示:在连接成功后会产生一个新的socket对象newfd,在之后的操作中用的是newfd而不是最开始创建的socket_fd。

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

C语言实现TCP服务器与客户端通信 的相关文章

随机推荐

  • TeamTalk HttpParser详解

    1 简介 TeamTalk http解析实际上是利用了ngnix的http parse解析库 2 HTTP简介 请求报文 参考图解HTTP 上野宣 响应报文 参考图解HTTP 上野宣 URI格式 参考图解HTTP 上野宣 3 ngnix h
  • MATLAB随机生成大小也是随机的矩形(地形图一)

    有一个需求需要要生成地貌一样的随机地形图 xff0c 首先我通过在固定大小的矩形面板上生成多个大小不一的矩形 xff0c 然后赋予每个矩形随机的高度 xff0c 然后再进行滤波得到想要的地形图 先直接贴一段代码 xff0c 看看是如何在面板
  • nvidia-smi:command not found 问题解决,Failed to initialize NVML: Driver/library version mismatch

    在装驱动之后 发现nvidia smi不能用了 于是在网上找到了解决方案 简单来看 xff0c 就两步 1 unload nvidia kernel mod 2 reload nvidia kernel mod 执行起来就是 1 sudo
  • 基于OpenCV的双目深度估计实现与改进

    双目深度估计 一 传统方法 常用的方法有SAD匹配算法 xff0c BM算法 xff0c SGBM算法 xff0c GC算法 1 1 SAD算法 SAD Sum of absolute differences 是一种图像匹配算法 xff0c
  • Libstdc++.so.6: version `GLIBCXX_3.4.22’ not found(conda)

    error Libstdc 43 43 so 6 version 96 GLIBCXX 3 4 22 not found fix 在conda环境下 xff0c 由于安装了某些模块 xff0c 使得模块的版本不一样 其中libstdc 43
  • pytoch报错OSError: [Errno 24] Too many open files

    因为默认的file descriptor共享策略使用文件描述符作为共享内存句柄 xff0c 并且当DataLoader上有太多批次时 xff0c 这将达到限制 要解决此问题 xff0c 您可以通过将其添加到脚本来切换到file system
  • MXNet的gluon转symbol并保存

    from mxnet gluon model zoo import vision import mxnet as mx import numpy as np mobilenetv205 61 vision get model 39 mobi
  • 激光雷达技术路线:机械式、MEMS是主流,OPA、Flash、FMCW发展空间大

    激光雷达是通过发射激光束来探测物体与传感器之间精准距离的主动测量装置 xff0c 包含发射单元 接收单元 扫描单元以及数据处理单元 激光雷达通过激光器和探测器组成的收发阵列 xff0c 结合光束扫描 xff0c 可以对广义机器人所处环境进行
  • C++ 错误解决 —— internal compiler error

    问题 xff1a g 43 43 编译时 xff0c 报错 xff1a g 43 43 internal compiler error Killed program cc1plus 出错原因 xff1a 出错的原因是 xff08 虚拟机 x
  • 基于STC89C52的智能小车——红外避障篇

    做这个小车真是历尽波折 因为我的零件是散买的 xff0c 所以在组装时出了各种幺蛾子 先是装马达的时候发现螺丝买短了 xff0c 之后又是单片机最小单元装不到小车底板上 千辛万苦把小车组装好了 xff0c 终于可以开心 xff08 并不 x
  • make、makefile、cmake之间的区别与联系

    make makefile cmake之间的区别与联系 首先说明一下make makefile cmake存在的原因 在进行编译时 xff0c 如果程序只有一个源文件 xff0c 那么我们可以直接利用gcc命令对其进行编译 xff1b 但是
  • 基于STC89C52的智能小车——PWM调速篇

    虽然我的小车因为电池电压太低慢的要死 xff0c 不过PWM还是要学的 PWM简单来说就是通过调整占空比 xff08 一个时间段 t 内电机运行的时间占总时间的比例 xff09 来调整小车速度 当然为了小车运行稳定 t 必须很小 xff0c
  • 基于STC89C52的智能小车——红外避障+PWM调速篇

    这篇学习笔记虽然看起来很水 xff0c 毕竟红外避障和PWM在之前的学习笔记里都写过了 xff0c 但这次确实是我耗时最久的一次作业 用软件实现PWM真是一个深渊巨坑 首先是由于小车的方向函数的运作方式是切换运动状态 xff0c 而我们用P
  • 基于STC89C52的智能小车——蓝牙遥控篇

    蓝牙遥控是依靠单片机的串口通讯来实现的功能 这周我主要学习的内容是串口通讯 在完成学习后我用之前买避障小车时顺便买的蓝牙模块做了一个升级版智能小车 xff0c 它可以通过蓝牙模块实现避障模式与蓝牙遥控模式的切换以及速度的调整 蓝牙模块的接线
  • DS1302实时时钟

    DS1302是一款可离线运转的实时时钟 本周我的学习任务是利用它和LCD1602来在学习板上制作一个时钟 下面是代码 xff08 除LCD1602的头文件 xff09 main span class token macro property
  • 利用矩阵键盘制作密码锁

    本周学习了关于矩阵键盘的知识 xff0c 并利用矩阵键盘制作了密码锁 矩阵键盘利用矩阵式的连接减少了IO口的使用 xff0c 并用扫描的方式保证每一个按键的响应 下面是代码 main span class token macro prope
  • LED点阵

    本周的学习内容是LED点阵的使用 其实LED点阵与动态数码管的原理非常相似 xff0c 都是通过扫描和视觉暂停现象来实现多个LED同时点亮的视觉效果 不同的是 xff0c 点阵可以通过74HC595来实现三根线串行输入多根线并行输出的效果
  • 前端进度条动画(自定义颜色)

    前端进度条动画 xff08 自定义 代码如下 xff08 示例 xff09 xff1a span class token operator lt span template span class token operator gt span
  • Keil调试中遇到问题汇总

    1 Keil MDK中工程编译弹出提醒框 xff1a Browse information of one of more files is not available Doing a project rebuild might fix th
  • C语言实现TCP服务器与客户端通信

    以上是TCP通信客户端与服务器实现通信的基本原理流程图 1 客户端的实现 xff08 4个步骤 xff09 1 1创建socket对象 1 2请求连接 1 3发送数据 1 4关闭套接字 include lt stdio h gt inclu