利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序,谈谈思路

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序
简易聊天程序要求:
1.使用c/c++语言;
2.利用TCP/IP协议,实现局域网内的聊天通信,可互发消息及图片,并实现通信记录保存;
3.ui风格自拟。
4.编程环境:VS、QT,或其他自选,VS或QT环境下选择窗口项目。
5.教一下我如何运行你写的程序(用什么软件、程序放到哪里)

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  创建一个完整的简易聊天程序,我可以提供一个基础的框架和指导,帮助你开始构建这个程序。下面是一个使用C语言和TCP/IP协议的简易聊天程序的基本框架,以及如何运行它的说明。

服务端代码示例(server.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> 
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080
#define MAXBUF 2048

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[MAXBUF] = {0};
    char *hello = "Hello from server";

    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, (char *)&opt, sizeof(opt));

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 5);

    printf("Server is listening on port %d\n", PORT);

    while (1) {
        new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
        if (new_socket < 0) {
            perror("Accept failed");
            exit(1);
        }

        printf("Server accepted new connection\n");

        send(new_socket, hello, strlen(hello), 0);
        read(new_socket, buffer, MAXBUF);
        printf("Client said : %s\n", buffer);

        // 保存通信记录到文件
        FILE *file = fopen("server_log.txt", "a");
        if (file) {
            fputs(buffer, file);
            fclose(file);
        }

        close(new_socket);
    }

    return 0;
}

客户端代码示例(client.c):

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

#define PORT 8080
#define MAXBUF 2048

void error(const char *msg) {
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[]) {
    int sockfd, connfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[MAXBUF];

    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }

    // 建立socket连接
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
       error("ERROR opening socket");

    server = gethostbyname(argv[1]);
    if (server == NULL) {
       fprintf(stderr,"ERROR, no such host\n");
       exit(0);
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(PORT);

    // 连接到服务器
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
        error("ERROR connecting");

    printf("Please enter message : ");
    while(fgets(buffer, MAXBUF, stdin) != NULL) {
        write(sockfd, buffer, strlen(buffer));
        read(sockfd, buffer, MAXBUF);
        printf("From server : %s",buffer);
    }

    close(sockfd);
    return 0;
}

编译和运行程序:

  1. 编译程序:使用GCC编译器编译服务端和客户端程序。打开终端或命令提示符,然后运行以下命令:

    gcc server.c -o server
    gcc client.c -o client
    
  2. 运行服务端:在终端运行编译好的服务端程序:

    ./server
    
  3. 运行客户端:在另一个终端窗口运行客户端程序,并提供服务器的主机名或IP地址作为参数:

    ./client hostname_or_IP_address
    
  4. 聊天:在客户端程序中输入消息,然后按回车发送。服务端将接收消息并将其保存到server_log.txt文件中,然后返回一条消息给客户端。

注意事项:

  • 这个示例程序是非常基础的,没有错误处理和多客户端支持。
  • 实际的聊天程序可能需要更多的特性,比如多线程或非阻塞I/O来同时处理多个客户端。
  • UI风格可以通过图形界面库如Qt来实现,但这需要更深入的学习和代码编写。

  如果你只学过基础的C语言,我建议你从基础的TCP/IP socket编程开始学习,逐步增加功能和复杂性。同时,Qt等图形界面库的学习曲线可能比较陡峭,需要一定的时间来掌握。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 00:36:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 00:36:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 00:36:02       58 阅读
  4. Python语言-面向对象

    2024-07-13 00:36:02       69 阅读

热门阅读

  1. 【Linux】shell基础&知识点(updating)

    2024-07-13 00:36:02       15 阅读
  2. AC修炼计划(AtCoder Regular Contest 179)A~C

    2024-07-13 00:36:02       20 阅读
  3. 迎接AI新时代:GPT-5的技术飞跃与未来展望

    2024-07-13 00:36:02       23 阅读
  4. JVM的基础,class文件的理解(2)

    2024-07-13 00:36:02       22 阅读
  5. Onnx 1-深度学习-概述1

    2024-07-13 00:36:02       27 阅读
  6. WPF透明置顶窗口wine适配穿透问题解决

    2024-07-13 00:36:02       23 阅读
  7. qt explicit 啥意思

    2024-07-13 00:36:02       26 阅读
  8. 【spring boot项目】mybatis-plus配置类

    2024-07-13 00:36:02       20 阅读