首页 > 其他分享 >C语言实现TCP CS模型代码,客户端服务器

C语言实现TCP CS模型代码,客户端服务器

时间:2023-12-19 16:48:52浏览次数:24  
标签:serv addr buffer TCP C语言 fd CS include socket

服务端将接受客户端发送的数据并将其转换成大写形式,然后再发送给客户端,客户端将发送一个字符串给服务器,并显示来自服务器的响应内容。

服务器

点击查看代码
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <ctype.h> 
 
 
#define PORT        8080 
#define BUFFER_SIZE 1024 
 
 
int main() { 
    int socket_fd, conn_fd; 
    socklen_t cli_len; 
    struct sockaddr_in serv_addr, cli_addr; 
    char buffer[BUFFER_SIZE]; 
 
 
    // 创建socket 
    if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
        perror("Socket creation failed"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    // 初始化地址和端口 
    memset(&serv_addr, 0, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(PORT); 
 
 
    // 绑定地址和端口 
    if (bind(socket_fd, (const struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { 
        perror("Bind failed"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    // 监听连接 
    if (listen(socket_fd, 10) == -1) { 
        perror("Listen failed"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    printf("Server started at port %d ...\n", PORT); 
 
 
    while(1) { 
        // 接受连接请求 
        cli_len = sizeof(cli_addr); 
        conn_fd = accept(socket_fd, (struct sockaddr*)&cli_addr, &cli_len); 
        if (conn_fd == -1) { 
            perror("Accept failed"); 
            exit(EXIT_FAILURE); 
        } 
 
 
        printf("Accepted client connection from %s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); 
 
 
        while(1) { 
            // 接受客户端发送的数据 
            memset(buffer, 0, sizeof(buffer)); 
            if (recv(conn_fd, buffer, sizeof(buffer), 0) == -1) { 
                perror("Receive failed"); 
                exit(EXIT_FAILURE); 
            } 
 
 
            // 转换为大写形式 
            for (int i = 0; i < strlen(buffer); i++) { 
                buffer[i] = toupper(buffer[i]); 
            } 
 
 
            // 发送数据回客户端 
            if (send(conn_fd, buffer, strlen(buffer), 0) == -1) { 
                perror("Send failed"); 
                exit(EXIT_FAILURE); 
            } 
 
 
            // 输出客户端发来的数据 
            printf("Received data from %s:%d: %s\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buffer); 
        } 
 
 
        // 关闭连接 
        close(conn_fd); 
    } 
 
 
    // 关闭监听 
    close(socket_fd); 
 
 
    return 0; 
} 

客户端

点击查看代码
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
 
 
#define PORT        8080 
#define BUFFER_SIZE 1024 
 
 
int main() { 
    int socket_fd; 
    struct sockaddr_in serv_addr; 
    char buffer[BUFFER_SIZE]; 
 
 
    // 创建socket 
    if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
        perror("Socket creation failed"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    // 初始化地址和端口 
    memset(&serv_addr, 0, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(PORT); 
 
 
    // 连接到服务器 
    if (connect(socket_fd, (const struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { 
        perror("Connect failed"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    printf("Connected to server at %s:%d ...\n", inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)); 
 
 
    while(1) { 
        // 从标准输入读取要发送的数据 
        memset(buffer, 0, sizeof(buffer)); 
        printf("Please enter data to send to server (type \"exit\" to quit):\n"); 
        fgets(buffer, sizeof(buffer), stdin); 
 
 
        // 退出循环 
        if (strcmp(buffer, "exit\n") == 0) { 
            close(socket_fd); 
            exit(EXIT_SUCCESS); 
        } 
 
 
        // 发送数据到服务器 
        if (send(socket_fd, buffer, strlen(buffer), 0) == -1) { 
            perror("Send failed"); 
            exit(EXIT_FAILURE); 
        } 
 
 
        // 接受服务器返回的数据 
        memset(buffer, 0, sizeof(buffer)); 
        if (recv(socket_fd, buffer, sizeof(buffer), 0) == -1) { 
            perror("Receive failed"); 
            exit(EXIT_FAILURE); 
        } 
 
 
        // 输出服务器返回的数据 
        printf("Received data from server: %s\n", buffer); 
    } 
 
 
    return 0; 
} 

标签:serv,addr,buffer,TCP,C语言,fd,CS,include,socket
From: https://www.cnblogs.com/cyj22/p/17914109.html

相关文章

  • 微信小程序使用iconfont通过transfonter转化成只有css样式的方式
    1.通过iconfont 网站选择对应图表加入购物车,然后添加到自己对应项目中,现在至本地。2.解压下载到本地的文件 3.进入 transfonter 后,点击Addfonts按钮,将上图中红色框中的文件上传上去,勾选启用 Base64encode ,点击Convert按钮,完成后点击下载Download 4.解压转......
  • CSPM和PMP怎么选?来看对比!
    最近给大家介绍了几个项目管理行业的证书,那么很多宝子都在好奇,PMP®和CSPM证书二者到底有什么区别和联系呢?  一、PMP®与CSPM的简介 PMP®——项目管理专业人士资格认证 PMP®考试是由PMI®(美国项目管理协会ProjectManagementInstitute)组织和出题,严格评估项目管理人员知识......
  • CSP-S 400分 题单总结
    CSP-S400分题单总结(未完待续)洛谷题号CSP-S400分题单总结(未完待续)洛谷题号知识点/类型T2T3T4T5T6知识点/类型T2T3T4T5拓扑排序 180710387077 树形DP 862530474362 241971132899   874440843177 271219833243  ......
  • ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string)
    1、match略1.1不同字段权重如果需要为不同字段设置不同权重,可以考虑使用bool查询的should子句来组合多个match查询,并为每个match查询设置不同的权重。{"query":{"bool":{"should":[{"match":{"product_name":......
  • 记录elasticsearch 8.1.1 集成 kibana
    1.官网下载kibanahttps://www.elastic.co/cn/downloads/elasticsearch 解压,直接启动下面的  第一次会生成token  如果没有保存,可就有点麻烦了,这里直接关闭es的密码认证服务     然后切换到kibana目录直接启动    这样kibana可以直接......
  • MFC CStatic 里面加载图片
    ▲效果头文件新增空间指针:private:CStatic*pBMP;BOOLCMFCApplicationBMPDlg::OnInitDialog()里面初始化://TODO:在此添加额外的初始化代码//初始化字段pBMP=(CStatic*)GetDlgItem(IDC_STATIC_BMP);//除了添加控件,还有这种方式获得控件的方式。pBMP->ModifyStyl......
  • 【C语言】结束符’\0‘ & gets()字符串输入函数
    ......
  • 【C语言】结束符"\0" & gets()字符串输入函数
    ......
  • css3
    目录CSS介绍CSS语法规范css代码风格样式格式书写紧凑格式展开格式样式大小写小写格式(推荐)大写格式样式空格风格css选择器的作用css基础选择器选择器分类标签选择器作用优缺点类选择器语法规范多类名选择器多类名使用方式多类名开发中使用场景id选择器id选择器和类选择器的区别......
  • Elasticsearch 地理搜索聚合
     数据类型查询功能聚合功能geo_pointgeo_shape[geoshape]查询文档的geo-shape是否跟查询指定geo-shape相交、内嵌、不相交。[geoboundingbox]查询文档的point是否在指定的矩形范围内。[geodistance]:查询中心点指定半径范围内的文档聚合功能[geopolygon]查......