服务器端 客户端 之间socket通信(C实现)

2023-05-16

 1.服务器端

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

#define PORT 2345
#define MAXSIZE 1024

int main(int argc, char *argv[])
{
    int i=1,h=2;

    printf("i + h = %d\n", i+h);

    int sockfd, newsockfd;

    //定义服务端套接口数据结构
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int sin_size, portnumber;

    //发送数据缓冲区
    char buf[MAXSIZE];

    //定义客户端套接口数据结构
    int addr_len = sizeof(struct sockaddr_in);

    //创建socket接口
    //协议族 AF_INET:TCP/IP – IPv4
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        fprintf(stderr, "create socket failed\n");
        exit(EXIT_FAILURE);
    }

    puts("create socket success");
    printf("socket is %d\n", sockfd);

    //清空表示地址的结构体变量
    bzero(&server_addr, sizeof(struct sockaddr_in));

    //设置addr的成员变量信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    //设置ip为本机ip
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //绑定端口
    if(bind(sockfd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) < 0){
        fprintf(stderr, "bind failed\n");
        exit(EXIT_FAILURE);
    }

    puts("bind success\n");

    //监听端口
    if(listen(sockfd, 10) < 0){
        perror("listen fail\n");
        exit(EXIT_FAILURE);
    }

    puts("listen successs\n");
    sin_size = sizeof(struct sockaddr_in);
    printf("sin_size is %d\n", sin_size);

    //接收,等待连接
    if((newsockfd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) < 0){
        perror("accept error");
        exit(EXIT_FAILURE);
    }

    printf("accept a new connetction\n");
    printf("new socket id is %d\n", newsockfd);
    printf("Accept cilent ip is %s\n", inet_ntoa(client_addr.sin_addr));
    printf("Connect successful please input message\n");

    char mybuf[1024];
    char sendbuf[1024];

    while(1){
        int len = recv(newsockfd, mybuf, sizeof(mybuf), 0);
        
        //strcmp比较字符串
        if(strcmp(mybuf, "exit\n") == 0) break;

        //输出buf中数据
        fputs(mybuf, stdout);

        send(newsockfd, mybuf, len, 0);

        memset(sendbuf, 0, sizeof(sendbuf));
        memset(mybuf, 0, sizeof(mybuf));
    }

    close(newsockfd);
    close(sockfd);
    puts("exit success");
    exit(EXIT_SUCCESS);
    return 0;
}

2.客户端 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<errno.h>

#define PORT 2345

int count = 1;

int main()
{
    int sockfd;
    char buffer[2014];
    struct sockaddr_in server_addr;
    struct hostent *host;
    int nbytes;

    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        fprintf(stderr, "Socket Error is %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    //清空表示地址的结构体变量
    bzero(&server_addr, sizeof(server_addr));

    //设置addr的成员变量信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    //设置ip为本机ip
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //客户端发出请求
    if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1){
        fprintf(stderr, "Connect failed\n");
        exit(EXIT_FAILURE);
    }

    char sendbuf[1024];
    char recvbuf[2014];

    while(1){

        // fgets(sendbuf, sizeof(sendbuf), stdin);
        // send(sockfd, sendbuf, strlen(sendbuf), 0);

        // if(strcmp(sendbuf, "exit\n") == 0) break;
        // recv(sockfd, recvbuf, sizeof(recvbuf), 0);
        // fputs(recvbuf, stdout);
        // memset(sendbuf, 0, sizeof(sendbuf));
        // memset(recvbuf, 0, sizeof(recvbuf));


        fgets(sendbuf, sizeof(sendbuf), stdin);
        send(sockfd, sendbuf, strlen(sendbuf), 0);
        //fputs(sendbuf, stdout);


        if(strcmp(sendbuf, "exit\n") == 0) break;
        recv(sockfd, recvbuf, sizeof(recvbuf), 0);
        fputs(recvbuf, stdout);
        memset(sendbuf, 0, sizeof(sendbuf));
        memset(recvbuf, 0, sizeof(recvbuf));

    }

    close(sockfd);
    exit(EXIT_SUCCESS);
    return 0;
}

参考博客:(4条消息) linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)_kunkliu的博客-CSDN博客

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

服务器端 客户端 之间socket通信(C实现) 的相关文章

  • UART 简介

    1 引脚 UART 是一种异步全双工通信方式 xff0c 所以除了电源引脚之外 xff0c UART 常有引脚有 TXD xff0c RXD xff1b 除此之外还有硬件流控引脚 RTS 和 CTS TXD 是发送引脚 xff0c RXD
  • 无人机飞控三大算法:捷联式惯性导航系统、卡尔曼滤波算法、飞行控制PID算法

    无人机飞控三大算法 xff1a 捷联式惯性导航系统 卡尔曼滤波算法 飞行控制PID算法 一 捷联式惯性导航系统 说到导航 xff0c 不得不说GPS xff0c 他是接受卫星发送的信号计算出自身位置的 xff0c 但是当GPS设备上方被遮挡
  • [学习笔记-01]关于单片机的中断处理机制(一)

    单片机的中断处理机制 1 什么是中断 xff1f 1 1 为什么要使用中断 中断的特点 1 2 什么是中断源 xff1f 1 2 1中断源有哪些 2 中断机制的流程3 中断优先级3 1 多个中断同时发生3 2 中断嵌套 1 什么是中断 xf
  • 黑苹果突然某一天无法上网?可能设置了BIOS,这样可以有网了!

    如图所示 xff0c 本人是微星迫击炮B450 xff08 非MAX xff09 xff0c 进入BIOS设置网卡 xff0c 可以解决这样的没网的问题 如果各位的BIOS不是微星 xff0c 也没有关系 xff0c 可以找到类似的功能就可
  • LSTM模型、双向LSTM模型以及模型输入输出的理解

    循环神经网路 xff08 RNN xff09 在工作时一个重要的优点在于 xff0c 其能够在输入和输出序列之间的映射过程中利用上下文相关信息 然而不幸的是 xff0c 标准的循环神经网络 xff08 RNN xff09 能够存取的上下文信
  • 无人机中的PID控制代码略解

    无人机中的PID控制代码略解 PID的控制规律 xff1a 参考 xff1a Amov实验室 PX4中级课程 PID基础 频域函数 xff1a u s
  • 如何用Python在图片上绘制BoundingBox

    参考资料 xff1a https blog csdn net weixin 41735859 article details 106599903 在目标检测等CV领域的任务里 xff0c 经常会涉及到在图片上绘制BBox xff0c 也就是
  • uart

    1 关于UART的基本特性 xff1a xff08 1 xff09 异步串行通信 xff0c 可为全双工 半双工 单发送TX或单接收RX模式 xff1b xff08 2 xff09 支持5 xff5e 8位数据位的配置 xff0c 波特率几
  • STM32--数码管显示使用

    STM32 数码管显示 简介 1 硬件部分 STM32F103C8T6 最小系统板 一位共阴数码管 2 软件部分 Keil软件编程 数码管码表 硬件部分 数码管 简介 数码管 xff0c 也称作辉光管 xff0c 是一种可以显示数字和其他信
  • LXC 和 LXD 容器总结

    1 概述 1 1 LXC LXC是Linux Containers的缩写 它是一种虚拟化技术 xff0c 通过一个Linux内核在一个受控主机上虚拟地运行多个Linux系统 LXC使用内核的Cgroups功能 xff0c 来提供进程和网络空
  • Altium designer -- 基本规则设置--间距设置Clearance

    Altium designer 基本规则设置 xff08 1 xff09 间距设置Clearance 硬件设计 软件 Altium designer 10PCB设计 间距设置 规则名称1 xff1a Clearance 一般间距 最小间距
  • Python 百度智能云文字识别 实现手写文字识别

    Python 实现手写文字识别 简介 百度智能云人工智能平台文字识别接口使用下载IP摄像头应用 调用手机摄像头 xff0c 实现拍照实现文字识别 Python 百度智能云人工智能文字识别接口 实现手写文字识别 百度智能云 创建应用 创建Py
  • Python 天气 简单 数据分析及可视化

    Python 天气情况数据分析及可视化 环境配置 Pycharm开发环境 python 版本 python3 7 Anconda 集成开发环境 第三方库导入 span class token comment pip install 模块 清
  • STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示

    STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示 简介 BMP280是博世最新推出的数字气压传感器 xff0c 具有卓越的性能和低廉的价格 xff0c 相对精度为 0 12 hPa xff08 相当于 1米 xff09
  • 51单片机学习 光敏电阻传感器实验

    51单片机学习 光敏电阻传感器实验 一 光敏电阻模块简介 光敏电阻传感器模块是对光线敏感度的反应 xff0c 一般用来检测探头周围光线的强度 xff08 亮度 xff09 xff0c 可以通过DO输出数字信号1和0 xff0c 也可以通过A
  • 基于STM32的物联网环境监测系统

    基于STM32的物联网环境监测系统 xff08 Internet of Things environmental monitoring system based on STM32 xff09 基于机智云物联网的环境监测系统 视频演示 摘 要
  • 合宙ESP32S3 CameraWebServe 测试demo

    合宙ESP32S3 CameraWebServe 合宙ESP32S3 CameraWebServe测试 xff0c 我们需要一个OV2640的摄像头模组用来采集图像传输给ESP32的 xff0c 这里使用的OV2640是之前安信可十周年的白
  • 【学习笔记汇总】OpenStudyNote

    OpenStudyNote https imgse com i ppE5FpQ 本科毕业设计 Internet of Things environmental monitoring system based on STM32 STM32系列
  • 计算机视觉:场景识别(Scene Recognition)

    计算机视觉 xff1a 场景识别 xff08 Scene Recognition xff09 场景识别图像分类特征提取词袋模型集成学习分类器 算法设计结果分析总结与展望总结展望 完整程序请移步至此链接下载 场景识别 在这个项目中 xff0c
  • ROS学习笔记(六):TF坐标变换

    ROS学习笔记 xff08 六 xff09 xff1a TF坐标变换 TF的基本知识TF工具tf monitortf echostatic transform publisherview framesrqt tf tree 各坐标系及其关系

随机推荐