如何编写C++简易聊天程序 控制台输入输出与网络基础

要编写一个c++++简易聊天程序,核心在于掌握控制台输入输出、tcp/ip套接字编程及并发处理。1. 程序分为客户端和服务端,通过socket通信;2. 使用多线程实现并发,一个线程处理发送(监听用户输入并发送),另一个线程处理接收(监听网络并输出);3. 服务端流程包括初始化、创建socket、绑定地址端口、监听、接受连接、收发数据、关闭清理;4. 客户端流程包括初始化、创建socket、连接服务器、收发数据、关闭清理;5. 优雅关闭使用shutdown()通知对方不再发送或接收,再调用close()释放资源;6. 错误处理依赖返回值检查,windows用wsagetlasterror()获取错误码,linux用errno,同时需记录日志并反馈用户,确保资源正确释放。

如何编写C++简易聊天程序 控制台输入输出与网络基础

编写一个C++的简易聊天程序,核心在于掌握控制台的输入输出、理解基本的网络通信(特别是TCP/IP套接字编程)以及处理并发。说白了,就是让你的程序既能跟用户“对话”,又能通过网络跟另一个程序“对话”。这听起来复杂,但拆解开来,无非就是几块积木的搭建。

如何编写C++简易聊天程序 控制台输入输出与网络基础

一个简易的C++聊天程序,通常会分成客户端和服务端两部分,它们通过套接字(socket)进行网络通信。用户在控制台输入消息,程序通过网络发送出去;同时,程序也在监听网络,接收到消息后显示在控制台上。这个过程中,最关键的挑战在于输入输出的并发处理:你不能因为等待用户输入而停止接收网络消息,反之亦然。所以,多线程是几乎必然的选择。

C++中如何实现控制台输入输出的并发处理?

在我看来,处理控制台输入输出与网络通信的并发,是构建聊天程序时首先要面对的“坎”。毕竟,std::cin是阻塞的,它会一直等着用户敲回车;同样,recv函数在没有数据到达时也会阻塞。如果它们都在主线程里,那程序就成了“单线程模式”——要么在等用户输入,要么在等网络消息,无法同时进行。这体验可想而知,简直是灾难。

立即学习“C++免费学习笔记(深入)”;

如何编写C++简易聊天程序 控制台输入输出与网络基础

解决这个问题的直接办法就是引入多线程。我的做法通常是这样的:

一个线程专门负责发送消息: 这个线程会持续地从std::cin读取用户的输入,然后将这些输入通过网络套接字发送出去。另一个线程专门负责接收消息: 这个线程会持续地从网络套接字接收数据,一旦有数据到达,就将其打印到std::cout上。

这样,主线程可以负责程序的初始化、连接建立,然后启动这两个“工作线程”,最后等待它们完成(或者在程序退出时进行清理)。

如何编写C++简易聊天程序 控制台输入输出与网络基础

举个例子,大概是这样:

// 伪代码,展示多线程概念#include #include #include #include  // 或  for Linuxvoid send_messages(SOCKET sock) {    std::string message;    while (true) {        std::getline(std::cin, message);        // 这里需要处理用户输入“退出”的逻辑        if (message == "exit") break;        send(sock, message.c_str(), message.length() + 1, 0); // +1 for null terminator    }}void receive_messages(SOCKET sock) {    char buffer[4096];    while (true) {        int bytes_received = recv(sock, buffer, sizeof(buffer) - 1, 0);        if (bytes_received <= 0) {            // 连接断开或错误            std::cout << "对方已断开连接或发生错误。" << std::endl;            break;        }        buffer[bytes_received] = ''; // 确保字符串以null结尾        std::cout << "收到: " << buffer << std::endl;    }}// 主函数里会创建这两个线程// std::thread sender_thread(send_messages, client_socket);// std::thread receiver_thread(receive_messages, client_socket);// sender_thread.join();// receiver_thread.join(); // 或者detach,取决于你的退出策略

这种分离职责的方式,让程序在等待用户输入的同时,依然能够及时响应并显示接收到的网络消息,用户体验会好很多。不过,需要注意的是,线程间的协作和程序的优雅退出是个细活,比如当用户输入“exit”时,如何通知另一个线程也安全退出,避免资源泄露。这往往需要一些共享状态(如原子变量或互斥量)和条件变量来协调。

C++网络编程中,服务端与客户端的基础通信流程是怎样的?

网络编程,特别是基于TCP的套接字编程,有一套相对固定的“舞蹈”步骤。理解这些步骤,就能搭建起最基础的通信骨架。在我看来,这就像是双方约定好的一套“握手”和“对话”的礼仪。

服务端(Server)的流程:

初始化网络环境: (仅限Windows)调用WSAStartup。这是Windows套接字编程的起点,没有它,你无法使用任何套接字函数。创建套接字: 调用socket()函数,指定使用IPv4(AF_INET)、TCP协议(SOCK_STREAM)。这就像是你在网络上开了一扇门。绑定地址和端口: 调用bind()函数,将创建的套接字与服务器的IP地址(通常是INADDR_ANY,表示监听所有可用网卡)和一个特定的端口号关联起来。端口号是服务识别的标志,比如80端口是HTTP,22端口是SSH。这扇门现在有了具体的地址和门牌号。监听连接: 调用listen()函数,让套接字进入监听状态,等待客户端的连接请求。你可以指定一个“待处理连接队列”的最大长度。这扇门现在是开着的,并且有人在门口等着接待。接受连接: 调用accept()函数,这是一个阻塞函数,它会一直等到有客户端连接上来。一旦有客户端连接,accept()会返回一个新的套接字,这个新的套接字是专门用于与当前连接的客户端进行通信的。原先的监听套接字则继续监听新的连接。这就像是来了一个客人,你派了一个专门的服务员去招待他,而你还在门口等着其他客人。收发数据: 使用send()和recv()函数通过这个新的套接字与客户端交换数据。关闭套接字: 当通信结束后,调用closesocket()(Windows)或close()(Linux)关闭套接字。清理网络环境: (仅限Windows)调用WSACleanup。

客户端(Client)的流程:

初始化网络环境: (仅限Windows)调用WSAStartup。创建套接字: 调用socket()函数,同样是AF_INET和SOCK_STREAM。这就像是你要去拜访别人家,先准备好自己的“通行证”。连接服务器: 调用connect()函数,传入服务器的IP地址和端口号。这会尝试与服务器建立TCP连接。如果成功,客户端和服务器之间就建立了一条可靠的通信链路。这就像是敲响了服务器的门,并成功进入。收发数据: 使用send()和recv()函数与服务器交换数据。关闭套接字: 通信结束后,调用closesocket()(Windows)或close()(Linux)关闭套接字。清理网络环境: (仅限Windows)调用WSACleanup。

这个流程构成了几乎所有基于TCP的网络应用的基础。理解了它,你就能知道数据是如何从一台机器流向另一台机器的。

在C++简易聊天程序中,如何优雅地处理网络连接的关闭与错误?

网络通信总是充满了不确定性,连接可能会意外中断,函数调用可能会失败。在我看来,一个健壮的聊天程序,不仅要能正常工作,还得能“体面地”处理这些异常情况。这就像是写代码,你不能只考虑“阳光大道”,还得为“崎岖小路”铺好石子。

优雅地关闭连接:

直接调用closesocket()(或close())固然可以关闭套接字,但它可能导致数据丢失(如果还有未发送的数据)。更优雅的方式是使用shutdown()函数。

shutdown(socket, SD_SEND):表示不再发送数据,但仍可接收数据。shutdown(socket, SD_RECEIVE):表示不再接收数据,但仍可发送数据。shutdown(socket, SD_BOTH):表示不再发送也不再接收数据。

通常的关闭流程是:

发送关闭通知: 当你不再需要发送数据时,调用shutdown(socket, SD_SEND)。这会向对方发送一个FIN(Finish)包,告知对方你这边不再发送数据了。接收剩余数据: 在发送完FIN包后,继续调用recv(),直到recv()返回0(表示对方也关闭了发送端)或者出错。这样可以确保你接收完对方在关闭前发送的所有数据。最终关闭: 最后调用closesocket()(或close())彻底释放套接字资源。

客户端检测服务器断开,或者服务器检测客户端断开,通常就是通过recv()函数的返回值来判断。如果recv()返回0,意味着对方已经正常关闭了连接;如果返回-1(或SOCKET_ERROR),则表示发生了错误。

错误处理:

C++网络编程中,套接字函数通常通过返回值来指示成功或失败。

返回值检查: 几乎所有套接字函数都会返回一个整数。在Windows上,SOCKET_ERROR表示失败;在Linux/Unix上,-1表示失败。获取错误码:Windows: 调用WSAGetLastError()函数可以获取最近一次套接字操作的错误码。你可以根据这些错误码(例如WSAECONNREFUSED连接被拒绝,WSAEADDRINUSE地址已被占用等)来判断具体出了什么问题。Linux/Unix: 检查全局变量errno,并使用perror()或strerror()来获取错误信息的字符串描述。日志记录与用户反馈: 发现错误时,应该记录详细的错误信息(包括错误码和描述),并给用户一个友好的提示,而不是让程序直接崩溃。资源清理: 无论程序是正常退出还是因为错误退出,都应该确保套接字资源被正确关闭,特别是Windows上的WSACleanup(),它必须在所有套接字操作完成后被调用。如果忘记清理,可能会导致资源泄露,甚至影响系统稳定性。

处理这些细节,虽然一开始看起来有些繁琐,但它能让你的程序在面对真实世界的网络环境时,显得更加成熟和可靠。毕竟,谁也不想用一个动不动就崩溃或者卡死的聊天工具,对吧?

以上就是如何编写C++简易聊天程序 控制台输入输出与网络基础的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1466186.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
STL算法如何与lambda表达式结合 简化回调函数的编写方式
上一篇 2025年12月18日 16:00:10
C++中内存对齐对性能的影响 缓存行优化实践
下一篇 2025年12月18日 16:00:19

相关推荐

  • 解决电脑升级Windows11卡住的问题(如何应对电脑在更新Windows11时出现卡顿的困扰)

    解决电脑升级Windows11卡住的问题(如何应对电脑在更新Windows11时出现卡顿的困扰)解决电脑升级Windows11卡住的问题(如何应对电脑在更新Windows11时出现卡顿的困扰)解决电脑升级Windows11卡住的问题(如何应对电脑在更新Windows11时出现卡顿的困扰)解决电脑升级Windows11卡住的问题(如何应对电脑在更新Windows11时出现卡顿的困扰)

    随着windows11的发布,许多用户都迫不及待地想要升级自己的电脑。然而,在更新过程中,有些用户遇到了一些问题,尤其是卡在更新界面无法继续的情况。本文将为大家分享一些解决电脑在更新windows11时卡住的问题的方法。 解决电脑升级Win11卡住的问题 在着手任何硬件项目之前,确定您的硬件与您的软…

    2026年9月28日 • 用户投稿
    000
  • 信息系统的核心组成部分

    信息系统的核心组成部分信息系统的核心组成部分信息系统的核心组成部分信息系统的核心组成部分

    1、 null 2、 信息系统是一个由计算机硬件、软件、网络设备、信息资源、用户以及管理制度共同组成的,致力于高效管理信息流动的人机协作体系,用以完成信息的采集、传递、存储与应用。 3、 系统涵盖信息输入、存储、处理、输出和控制五大核心功能,其发展历程可分为三个阶段:初始的数据处理系统、单一业务的管…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧

    sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧

    最直接的方法是使用Sublime Text的分屏布局功能,通过View → Layout选择Columns: 2等布局,将两个文件分别拖入不同面板进行对比;为进一步提升效率,可安装SublimeFileDiffs插件实现差异高亮比对,并结合快捷键、多视图管理与项目保存优化工作流。 Sublime T…

    2026年9月28日 • 用户投稿
    000
  • Win11更新遇到错误怎么解决?Win11更新遇到错误解决方法

    Win11更新遇到错误怎么解决?Win11更新遇到错误解决方法Win11更新遇到错误怎么解决?Win11更新遇到错误解决方法Win11更新遇到错误怎么解决?Win11更新遇到错误解决方法Win11更新遇到错误怎么解决?Win11更新遇到错误解决方法

    自从windows 11预览版推出以来,微软一直在积极解决系统中出现的各种问题,并陆续向用户推送了多个更新补丁。这些补丁旨在修复windows 11运行时的各类问题,然而部分用户在安装更新时却遭遇了错误提示。若在更新windows 11补丁时遇到此类问题,可以按照以下步骤操作: 首先,确保关闭或卸载…

    2026年9月28日 • 用户投稿
    000
  • 天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能

    天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能

    9月25日,天禧个人超级智能体正式宣布与字节跳动旗下的ai智能体开发平台“扣子”建立生态合作关系。继chatexcel凭借“对话做表”功能引发广泛关注后,此次携手扣子平台,不仅是天禧在ai能力上的又一次重要拓展,更意味着联想的ai战略已迈入平台整合与生态共建的新阶段,ai生态赋能的核心价值得到显著提…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么格式化json_Sublime Text JSON代码美化与格式化插件

    sublime怎么格式化json_Sublime Text JSON代码美化与格式化插件sublime怎么格式化json_Sublime Text JSON代码美化与格式化插件sublime怎么格式化json_Sublime Text JSON代码美化与格式化插件sublime怎么格式化json_Sublime Text JSON代码美化与格式化插件

    使用 Pretty JSON 插件可轻松格式化 JSON 文件,先通过 Package Control 安装插件,再按 Ctrl+Shift+P 调用命令实现美化与校验。 在 Sublime Text 中格式化 JSON 文件非常方便,只需借助一些轻量又实用的插件即可实现代码美化。最常用的方法是使用…

    2026年9月28日 • 用户投稿
    000
  • linux怎么运行脚本

    linux怎么运行脚本linux怎么运行脚本linux怎么运行脚本linux怎么运行脚本

    要在 Linux 中运行脚本,请先确保脚本具有可执行权限(ls -l script_name),然后通过以下几种方法运行脚本:命令行(./script_name)、Bash 命令(bash script_name)、Python 命令(python script_name.py)。脚本可以从命令行接…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI生成Python命令行工具

    如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具

    明确需求后,用豆包ai生成python命令行工具可节省时间。1. 首先清晰描述功能,如“根据关键词搜索指定目录下的文本文件”;2. 豆包ai会生成完整脚本结构,包括argparse参数解析和文件遍历逻辑;3. 可进一步要求优化,如忽略大小写、支持更多文件类型;4. 进阶可让其生成打包模板,便于pip…

    2026年9月28日 • 用户投稿
    000
  • 抖音直播号在哪里买?抖音直播号怎么申请

    抖音直播号在哪里买?抖音直播号怎么申请抖音直播号在哪里买?抖音直播号怎么申请抖音直播号在哪里买?抖音直播号怎么申请抖音直播号在哪里买?抖音直播号怎么申请

    随着抖音平台的持续火爆,越来越多用户将目光投向了抖音直播,希望通过直播实现个人价值或商业变现。然而,对于许多刚入行的新手主播而言,如何获取一个合适的直播账号成为了一大难题。本文将深入解析抖音直播号交易现状,全面解答“抖音直播号哪里买”这一热门问题,助你快速掌握购号技巧,顺利开启直播之路。 一、当前抖…

    2026年9月28日 • 用户投稿
    000
  • 抖音小店怎么设置佣金?抖音小店设置专属佣金

    抖音小店如今已成为众多商家扩展线上业务的重要渠道。在抖音小店中,科学地设置佣金是提升店铺盈利水平的核心环节。本文将深入探讨抖音小店佣金设置的具体方法,助力您熟练掌握佣金策略,提高店铺收益。 一、抖音小店佣金设置概要 佣金定义:佣金是商家向抖音平台支付的一笔费用,旨在鼓励达人推广商品。 佣金比例:抖音…

    2026年9月28日
    100
  • 如何通过容器化技术提升应用部署效率?

    如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?

    容器化技术通过打包应用及所有依赖,实现环境一致性,彻底解决“在我机器上能跑”的问题。Docker将应用封装为独立镜像,在任何服务器上都能可靠运行;Kubernetes则通过声明式配置实现自动化部署、扩缩容和自愈,极大提升效率与可靠性。实践中需避免镜像过大、网络配置复杂、持久化存储处理不当、资源限制缺…

    2026年9月28日 • 用户投稿
    000
  • linux怎么安装docker

    linux怎么安装dockerlinux怎么安装dockerlinux怎么安装dockerlinux怎么安装docker

    如何在 Linux 上安装 Docker?步骤如下:检查先决条件:内核版本 3.10+、RAM ≥ 2GB、稳定网络。安装依赖项:Ubuntu/Debian:apt-get install apt-transport-https…;CentOS/Red Hat:yum install y…

    2026年9月28日 • 用户投稿
    000
  • win8资源管理器停止工作_Win8资源管理器故障修复

    win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复

    首先重启Windows资源管理器进程,若无效则通过SFC和DISM命令修复系统文件,接着更新显卡驱动,禁用第三方外壳扩展,并修改注册表启用独立进程运行文件夹窗口,以解决资源管理器无响应或频繁崩溃问题。 如果您在使用Windows 8系统时,遇到资源管理器无响应或频繁崩溃的情况,这将导致桌面和任务栏消…

    2026年9月28日 • 用户投稿
    100
  • 如何将手机中的图片传到电脑上(简单操作让您快速实现图片传输)

    如何将手机中的图片传到电脑上(简单操作让您快速实现图片传输)如何将手机中的图片传到电脑上(简单操作让您快速实现图片传输)如何将手机中的图片传到电脑上(简单操作让您快速实现图片传输)如何将手机中的图片传到电脑上(简单操作让您快速实现图片传输)

    如何将智能手机连接到电脑智能手机与电脑之间的连接是现代生活中一项常见的任务。无论是传输文件、充电还是调试,都涉及到将这两台设备配对。本指南将向您展示如何轻松地将智能手机连接到电脑,为您提供逐步的说明和常见的故障排除技巧。php小编苹果将带领您了解将智能手机连接到电脑的各个方面,从使用 usb 数据线…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • linux怎么进入shell

    linux怎么进入shelllinux怎么进入shelllinux怎么进入shelllinux怎么进入shell

    有五种方法可以进入 Linux shell:打开终端窗口、使用 shell 命令、从桌面环境切换、通过 SSH、从引导菜单进入。 如何进入 Linux Shell Linux shell 是一个命令行界面,用户可以使用文本命令与操作系统交互。以下是一些进入 Linux shell 的方法: 1. 打…

    2026年9月28日 • 用户投稿
    000
  • 按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    近期,部分win10用户反馈,有时按下“w”键会出现ink工作区突然弹出的现象。如果你也遇到了这种情况,可以参考以下由小编整理的win10专业版解决按w弹出工作区的方法,问题的解决方案就在里面。 操作步骤如下: 首先,打开计算机,打开运行窗口,输入命令“regedit”,然后点击“确定”按钮; 随后…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 如何在Java中理解构造方法与析构方法

    构造方法用于对象初始化,Java无真正析构方法。构造方法与类同名,自动调用以初始化成员变量;而析构功能由垃圾回收器管理,finalize()已过时,推荐通过实现AutoCloseable接口并结合try-with-resources语句确保资源及时释放,提升代码安全性与效率。 在Java中,构造方法…

    2026年9月28日
    000

发表回复

登录后才能评论
关注微信