C语言实现简易Linux终端版本聊天室

本文介绍了如何使用C语言在Linux环境下实现一个简单的终端聊天室。服务器端包括创建套接字、绑定端口、监听连接、接收和分发数据等步骤;客户端则涉及连接服务器、读取转发消息及自由输入发送等功能。通过详细讲解服务器(server.c)和客户端(client.c)的代码实现,帮助读者理解C语言在Linux网络编程中的应用。
摘要由CSDN通过智能技术生成

简易Linux终端聊天室
必备Linux命令和C语言基础
http://www.makeru.com.cn/video/1876.html?s=69821在这里插入图片描述

今天我们来实现一个简单的小项目,在这个项目中,我们将实现一个终端版的简易Linux聊天室。  

实现的效果:服务器启动,监测客户端连接的个数,监测每个客户端的IP地址以及端口号,当每个客户端发送消息时,服务器上会有线程专门将每个客户端发送的信息记录在界面上,就类似平时使用QQ群聊一样。我们来看看这个简易的Linux聊天室如何来实现吧。如图4-5-12所示。

1、实现一个基本的服务器和客户端的步骤

一、创建服务器的流程

(1)调用socket函数创建一个套接口,并返回描述符。

(2)调用bind函数使服务器进程与一个端口号绑定。

(3)调用listen设置客户端如队列的大小。

(4)调用accept接收一个连接,如果接入队列不为空的话。并且相应返回一个已连接的套接口描述符。

(5)调用send和recv用来在已连接的套接口间进行发送和接收数据。

二、创建客户端流程

(1)调用socket函数创建一个套接口,并返回描述符。

(2)调用connect向服务器发送连接请求,返回一个已连接的套接口。

(3)调用send和recv在已连接的套接口间发送和接收数据。

1.1服务器将要完成的工作

(1)获取套接字

(2)设置端口复用

(3)绑定连接的IP还有端口号

(4)监听

(5)创建一条线程用于显示客户端连接信息,具体连接的人数,顺便将客户连接的IP以及端口号打印出来。

(6)开始接收

(7)创建一条线程用于将客户端直接收发的信息分发到客户端处进行显示。

下面具体看看服务器代码的实现 server.c

1#include <stdio.h>
  2#include <unistd.h>
  3#include <sys/socket.h>
  4#include <netinet/in.h>
  5#include <netinet/ip.h>
  6#include <string.h>
  7#include <pthread.h>
  8#include <sys/time.h>
  9//设置客户端最大的个数为40个
 10#define   MAXCONNECTION        40
 11#define   msleep(x)     (usleep(x*1000))
 12struct  Data
 13{
   
 14    int  live ;   //0  无人用   1有人用
 15    int  sockfd ; 
 16    struct in_addr in ; 
 17    unsigned short  port ; 
 18};
 19
 20struct Data array[MAXCONNECTION] = {
   0} ; 
 21void *do_thread_showconnect(void *arg);
 22void *do_thread_clientopt(void *arg);
 23int main(void)
 24{
   
 25    int sockfd ; 
 26    //1.获取套接字
 27    sockfd =  socket(AF_INET ,  SOCK_STREAM , 0);
 28    if(sockfd < 0)
 29    {
   
 30        perror("get socket fail");
 31        return -1 ; 
 32    }
 33    //2.设置端口复用
 34    int  on  = 4 ;  
 35    setsockopt(sockfd , SOL_SOCKET , SO_REUSEADDR , &on , sizeof(int));
 36    //3.绑定IP与端口
 37    struct  sockaddr_in  addr ; 
 38    addr.sin_family = AF_INET ; 
 39    addr.sin_port = htons(10086);
 40    //设置为INADDR_ANY,表示监听所有的。
 41    addr.sin_addr.s_addr = INADDR_ANY ; 
 42    int ret ; 
 43    ret = bind(sockfd , (struct sockaddr *)&addr , sizeof(struct sockaddr_in)) ; 
 
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值