socket多人聊天程序C语言版(一)

下面是“socket多人聊天程序C语言版(一)”的完整攻略。

一、前置知识

在学习本文前,需要掌握以下C语言知识:
- socket编程基础
- 线程基础
- 指针基础

二、程序结构

本程序主要分为四个模块:客户端、服务端、公共头文件和Makefile。

1. 公共头文件

  • common.h:包含了各种结构体和宏定义,以及客户端和服务端公共使用的函数的声明。

2. 客户端

  • client.c:客户端主文件,包含了主函数和各种客户端相关的函数的实现。

3. 服务端

  • server.c:服务端主文件,包含了主函数和各种服务端相关的函数的实现。

4. Makefile

  • Makefile:编译程序的文件,包含了编译链接的命令和参数。

三、程序实现

1. 公共头文件实现

在该文件中,定义了四个结构体和一些常量:
- CLIENT:用来记录客户端信息的结构体,包括客户端名字(name)、客户端套接字(client_sock_fd)和客户端地址(client_addr)。
- USER_LIST:用于记录所有已连接的客户端信息的链表结构体。
- MSG:用于记录消息的结构体,包括消息内容(content)和消息发送者的名字(name)。
- THREAD_INFO:用于记录线程的信息,包括线程ID(tid)和所属的客户端(client)。
- MAX_NAME_LEN:定义了客户端名字的最大长度。
- MSG_SIZE:定义了消息内容的最大长度。
- CLIENT_NUM:定义了可以同时连接的客户端数量。

在该文件中,还申明了一系列函数,包含了common.h文件的声明。

2. 客户端实现

2.1 void* recv_msg_thread(void* arg)

当客户端接收到新的消息时,该线程负责接收并将消息打印到客户端的终端上。

该函数包含两个参数:
- arg:线程信息的指针,记录了该线程的ID和其所属的客户端。
- 返回值:无。

2.2 void* send_msg_thread(void* arg)

该线程负责将客户端发送的消息发送给服务端。

该函数包含两个参数:
- arg:该线程所属的客户端的指针。
- 返回值:无。

2.3 int main(int argc, char* argv[])

该函数作为客户端程序的入口。在该函数中,客户端需要完成以下步骤:
- 通过命令行参数获取服务端IP地址和端口号。
- 创建一个套接字。
- 连接服务端。
- 通过新开两个线程分别接收和发送消息。
- 在主线程中等待客户端输入并发送消息。

3. 服务端实现

3.1 void* client_thread(void* arg)

该线程作为服务端接受客户端连接的响应程序,用于处理客户端发出的请求。

该函数包含一个参数:
- arg:客户端的套接字。
- 返回值:无。

3.2 int main(int argc, char* argv[])

该函数作为服务端程序的入口。在该函数中,服务端需要完成以下步骤:
- 通过命令行参数获取服务端IP地址和端口号。
- 创建一个服务器套接字。
- 绑定服务器套接字和IP地址、端口号。
- 开始监听连接请求。
- 当有新的客户端连接请求时,启动一个新线程处理该请求。

四、使用示例

1. 客户端运行示例

首先需要使用Makefile编译客户端程序:

make client

然后开启客户端程序,需要提供服务端的IP地址和端口号:

./client IP port

例如,连接IP为127.0.0.1,端口号为8000的服务端:

./client 127.0.0.1 8000

成功连接服务端后,客户端会提示用户输入用户名。输入完毕后,用户就可以在客户端上进行聊天了。

2. 服务端运行示例

首先需要使用Makefile编译服务端程序:

make server

然后开启服务端程序,需要提供IP地址和端口号:

./server IP port

例如,运行在127.0.0.1的8000端口上:

./server 127.0.0.1 8000

服务端成功运行后,将等待客户端连接。当有客户端连接时,服务端将在终端上输出连接的客户端信息。客户端连接成功后,可以进行聊天。

五、总结

本文介绍了socket多人聊天程序C语言版的实现方法。该程序实现了服务端和多个客户端之间的消息传输,使得多个客户端在同一个聊天室内进行聊天。本文结合具体示例详细讲解了该程序的实现过程,希望本文能够对希望学习socket编程的读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:socket多人聊天程序C语言版(一) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 荣耀畅玩8c怎么切换应用?荣耀畅玩8c切换应用程序方法

    荣耀畅玩8c怎么切换应用? 切换应用程序方法 荣耀畅玩8c采用的是EMUI 8.2系统,在该系统下,切换应用程序有以下几种方法: 方法一:使用应用切换键 荣耀畅玩8c的系统底部有一个虚拟的按键区域,其中最左边的按键为 应用切换键 。使用该按键切换应用程序的具体步骤如下: 点击 应用切换键 ,系统会显示最近打开的应用程序列表; 在列表中选择要切换的应用程序,点…

    C 2023年5月23日
    00
  • C语言简明讲解预编译的使用

    首先我们需要了解预编译器是什么,预处理指令的作用是什么,在C语言中如何使用预编译器。 什么是预编译器? 预编译器是C语言编译器的一部分,它是在编译正式开始之前处理源代码的一段程序。预编译器处理的代码包括头文件和宏定义等,在编译正式开始之前,预编译器将对这些代码进行处理并将处理后的代码输出,交给编译器进行编译。预编译器的处理结果就是一个纯C语言代码的文件。 预…

    C 2023年5月23日
    00
  • 模拟实现strlen的三种方法

    一、strlen()的工作原理 二、模拟实现strlen的三种方法 计数器方法 指针-指针 递归的方法 三、库函数实现strlen的思路 四、库函数的strlen同上面模拟实现strlen的区别 一、strlen工作原理 strlen函数工作原理:是计算字符串str的长度,直到空字符串结束,但不包含空字符串。(即该长度算至/0结束,但不包含/0) 通过以下代…

    C语言 2023年4月18日
    00
  • C++示例详解Prim算法与优先队列

    C++示例详解Prim算法与优先队列 什么是Prim算法? Prim算法是一种经典的最小生成树算法,它可以用于求无向连通图的最小生成树。该算法以一个顶点开始,通过不断地向外扩张生成最小生成树,最终遍历图中所有节点,并且每次扩张的时候选择权值最小的边。 Prim算法的实现流程 选取一个起始节点开始。 初始化辅助数组,该数组用来记录图中每个节点是否已经被访问,以…

    C 2023年5月23日
    00
  • C语言中的BYTE和char深入解析

    C语言中的BYTE和char深入解析 什么是BYTE BYTE是C语言中一种数据类型,其定义和大小并不与标准C语言中定义的数据类型相同。BYTE通常被定义为占用一个字节(即8位)的无符号整数数据类型,其范围为0至255。BYTE主要用于底层编程,如嵌入式系统、驱动程序等。 可以用以下方式定义BYTE类型: typedef unsigned char BYTE…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 位运算符<<的高级用法

    前言 在上一篇文章中,我们介绍了~运算符的高级用法,本篇文章,我们将介绍<< 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、计算2的整数次幂 代码示例 #include <stdio.h> int main() { in…

    C语言 2023年4月17日
    00
  • C 程序 查找数组元素的总和

    C程序 查找数组元素的总和 简介 本程序通过输入一个包含n个数的整型数组,求出数组中所有元素的总和。 使用攻略 编译环境 本程序使用C语言编写,建议使用gcc编译器,在Linux环境下执行。 输入数组 程序使用scanf函数从标准输入中读入数组元素,用户需输入n个整型数值,以空格或换行符分隔。 示例输入: 5 1 2 3 4 5 程序设计 本程序使用for循…

    C 2023年5月9日
    00
  • 一般故障排除步骤与方法

    一般故障排除步骤与方法是指在出现问题时,根据既定的步骤和方法,对系统进行排查、诊断和修复。以下是一般故障排除步骤与方法的完整攻略: 1.确认问题 提供详细信息,例如发生时间、出现的错误提示信息、是否有日志记录等。 尝试重复问题并确定是否一致。 确定问题的严重程度和影响范围。 2.收集信息 查看系统文件(日志文件、配置文件等)以及系统状态(CPU、内存)。 确…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部