【C语言】实现简易网络聊天室

项目:

制作一个简易的聊天室,实现实时非单机聊天

知识点:

总体框架:

socket() 创造套接字函数:

然后设置 bind() ,调整 IP 参数:

然后设置 listen() : 

 然后设置 accept() :

收发数据 recv(), send()/sendto(), read(), write() :

最后关闭 close() :

因为本身 socket 是一种文件描述符,所以最后要关闭打开的文件

 服务端:

1.创建sd

    //创建sdsd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");return -1;}

2.配置ip,端口属性

//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);

3.绑定ip和客户端 

    //绑定ip和客户端error = bind(sd,(struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create bind failed");close(sd);return -1;}

4.设置最大链接数,这个宏定义MAX_LISLEN=2,因为我这里只连接2个客户端,可以设置多个

//设置最大链接数error = listen(sd, MAX_LISLEN);if(error == -1){perror("create listem failed");close(sd);return -1;}

 5.等待客户端连接

 ad[i] = accept(sd,(struct sockaddr *)(&remote_ip),&remote_len);if(ad[i] == -1){perror("create ad failed");close(sd);return -1;}  

6.创造新线程,不断读取客户端发送的数据,别写入另外一个客户端

void * pthread_fun(void * arg)
{while(1){memset(buf,0,100);read(ad[(int )arg],buf,100);write(ad[((int )arg + 1) % 2],buf,100);}return (void *) 0;
}

客户端 :

 1.创建sd

    //创建sdsd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");return -1;}

2.配置ip,端口属性

//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);

3.连接服务端

//链接服务端error = connect(sd, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create connect failed");close(sd);return -1;}

 4.创建两个新线程,不断写数据个服务端,不断从服务端读数据

void * pthread_fun_write(void * arg)
{while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,100);}
}
void * pthread_fun_read(void * arg)
{while(1){memset(buf_read,0,100);read(sd,buf_read,100);printf("client2:%s\n",buf_read);}
}

附录 

服务端代码

#include<stdio.h>
#include<pthread.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
#define MAX_LISLEN 2
char buf_write[100];
char buf[100];
int ad[2];
struct sockaddr_in server_ip, remote_ip;
void * pthread_fun(void * arg)
{while(1){memset(buf,0,100);read(ad[(int )arg],buf,100);write(ad[((int )arg + 1) % 2],buf,100);}return (void *) 0;
}int main()
{pthread_t tid[2];int server_len , remote_len;int error, sd ;int i = 0;//创建sdsd = socket(AF_INET, SOCK_STREAM ,0);if(sd == -1){perror("create sd failed");return -1;//close(sd);}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);//绑定ip和客户端error = bind(sd,(struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create bind failed");close(sd);return -1;}//设置最大链接数error = listen(sd, MAX_LISLEN);if(error == -1){perror("create listem failed");close(sd);return -1;}remote_len = sizeof(struct sockaddr);while(1){//等待客户端申请ad[i] = accept(sd,(struct sockaddr *)(&remote_ip),&remote_len);if(ad[i] == -1){perror("create ad failed");close(sd);return -1;}  else{printf("client%d 加入聊天室\n",i+1);} //新线程,功能:不断读数据error = pthread_create(&tid[i],NULL,pthread_fun,(void*) i);if(error != 0){perror("create pthread_fun  failed");close(ad[i]);close(sd);return -1;} i++;}close(sd);return 0;}

客户端1代码 

#include<stdio.h>
#include<pthread.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
int sd;
char buf_write[100];
char buf_read[100];
struct sockaddr_in server_ip, remote_ip;
void * pthread_fun_write(void * arg)
{while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,100);}
}
void * pthread_fun_read(void * arg)
{while(1){memset(buf_read,0,100);read(sd,buf_read,100);printf("client2:%s\n",buf_read);}
}int main()
{int server_len,remote_len;pthread_t tid_read,tid_write;int error;sd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");return -1;}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);//链接服务端error = connect(sd, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create connect failed");close(sd);return -1;}error = pthread_create(&tid_write,NULL,pthread_fun_write,NULL);if(error != 0){perror("create pthread write failed");close(sd);return -1;} error = pthread_create(&tid_read,NULL,pthread_fun_read,NULL);if(error != 0){perror("create pthread read failed");close(sd);return -1;} pthread_join(tid_write,NULL);pthread_join(tid_read,NULL);return 0;
}

客户端2代码 

#include<stdio.h>
#include<pthread.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
int sd;
char buf_write[100];
char buf_read[100];
struct sockaddr_in server_ip, remote_ip;
void * pthread_fun_write(void * arg)
{while(1){memset(buf_write,0,100);scanf("%s",buf_write);write(sd,buf_write,100);}
}
void * pthread_fun_read(void * arg)
{while(1){memset(buf_read,0,100);read(sd,buf_read,100);printf("client1:%s\n",buf_read);}
}int main()
{int server_len,remote_len;pthread_t tid_read,tid_write;int error;sd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){perror("create sd failed");return -1;}//设置ip,端口server_ip.sin_family = AF_INET;server_ip.sin_port = htons(5678);server_ip.sin_addr.s_addr = htonl(INADDR_ANY);memset(server_ip.sin_zero,0,8);error = connect(sd, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));if(error == -1){perror("create connect failed");close(sd);return -1;}error = pthread_create(&tid_write,NULL,pthread_fun_write,NULL);if(error != 0){perror("create pthread write failed");close(sd);return -1;} error = pthread_create(&tid_read,NULL,pthread_fun_read,NULL);if(error != 0){perror("create pthread read failed");close(sd);return -1;} pthread_join(tid_write,NULL);pthread_join(tid_read,NULL);return 0;
}

写运行服务端创建sd,再运行客户端连接服务端,再不断加入客户端,注意最大加入数

运行结果:

想得美,直接动手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30993.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从一篇防范钓鱼邮件的通知说起

文章目录 1. 网络防骗无小事2. 安全需求很多&#xff0c;怎么办&#xff1f;3. 方案还是有的4. 不仅仅只是好用 1. 网络防骗无小事 网络冲浪一时爽&#xff0c; 网上翻车遭大殃。 网络安全无小事, 时时刻刻记心上。 当今社会&#xff0c;互联网把偌大的地球变成了一个地球村。…

【C++简单项目】基于socket实现的聊天室Chat_Room

一、需求分析 聊天室中如果有人说话&#xff0c;服务器将内容传送给聊天室的其他人。 那么就需要客户端和服务端两个程序&#xff0c;一个人发送一个消息&#xff0c;服务器向所有人发送一遍消息&#xff0c;所有人的客户端接收消息&#xff0c;也就是说客户端负责发送和接受消…

基于TCP的网络聊天室实现(C语言)

基于TCP的网络聊天室实现&#xff08;C语言&#xff09; 一、网络聊天室的功能二、网络聊天室的结果展示三、实现思路及流程四、代码及说明1.LinkList.h2.LinkList.c3.client.c4.server.c 一、网络聊天室的功能 有新用户登录&#xff0c;其他在线的用户可以收到登录信息 有用户…

CobaltStrike(钓鱼攻击工具)

一、介绍 1、CobaltStrike是一款渗透测试软件&#xff0c;分为客户端与服务端&#xff0c;可以进行团队分布式操作&#xff0c;服务端:1个&#xff0c;客户端:N个&#xff0c;被业界人称为CS神器。 2、CobaltStrike集成了端口转发、服务扫描&#xff0c;自动化溢出&#xff0c;…

Discord 私信钓鱼手法分析

事件背景 5 月 16 日凌晨&#xff0c;当我在寻找家人的时候&#xff0c;从项目官网的邀请链接加入了官方的 Discord 服务器。在我加入服务器后立刻就有一个"机器人"(Captcha.bot)发来私信要我进行人机验证。这一切看起来相当的合理。我也点击了这个验证链接进行查看。…

154.网络安全渗透测试—[Cobalt Strike系列]—[钓鱼攻击/鱼叉钓鱼]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录 一、钓鱼攻击和鱼叉钓鱼简介1、钓鱼攻击简介2、钓鱼攻击模块&#xff1a;6个3、鱼叉钓鱼简介4、鱼叉钓鱼示例&#xff1a;邮件钓鱼 二、钓鱼攻…

个人年终述职报告PPT怎么做?

适用于职场工作汇报、述职报告、岗位竞聘的PPT模板 这套微粒体风格的述职报告PPT模板采用了立体的几何图形设计&#xff0c;以白色、橙色、深蓝色为主&#xff0c;整体设计简约大气高端。其中还结合了时间轴、流程图、脑图等PPT素材&#xff0c;可以更直观展现工作述职报告的内…

计算机机房防雷接地标准,机房防雷接地规范与防雷接地方式,你知道吗?

雷电的描述 雷电是由天空中云层间的相互高速运动、剧烈磨擦&#xff0c;使高端云层和低端云层带上相反电荷。此时&#xff0c;低端云层在其下面的大地上也感应出大量的异种电荷&#xff0c;形成一个极大的电容&#xff0c;当其场强达到一定强度时&#xff0c;就会产生对地放电&…

地凯模块化机房防雷接地防雷工程设计方案

智能微模块的防雷接地系统由防雷方案和接地方案组成。 防雷方案&#xff1a;智能微模块主要有以下防雷工程方案。 SPD&#xff08;surge protection device&#xff09;浪涌保护器的安装符合以下要求&#xff1a;SPD 安装在被保护设备 的前端&#xff0c;SPD 的连接导线应尽可…

防雷工程中防雷等级的意义

在现代社会中&#xff0c;各种电子设备和通信系统已经成为我们生活中不可或缺的一部分。然而&#xff0c;雷击是这些设备和系统的一个常见问题&#xff0c;不仅会导致设备损坏&#xff0c;还可能对人们的生命财产造成威胁。因此&#xff0c;防雷措施变得尤为重要。 为了保护设…

防雷接地的施工工艺与防雷施工方案

雷电是自然界的一种强大而危险的自然现象&#xff0c;经常造成重大财产损失和人员伤亡。为了保护建筑物和人员免受雷电的危害&#xff0c;防雷接地系统的设计和施工至关重要。本文将介绍防雷接地的施工工艺和防雷施工方案&#xff0c;强调专业和符合国家标准的方法&#xff0c;…

防雷知识:什么是雷电浪涌

浪涌是突然发生并超过典型工作电压的过电压。一般来说&#xff0c;浪涌是电路中短暂的电流、电压或功率波。今天我们就来科普一下什么是雷电浪涌。 什么是浪涌&#xff1f; 浪涌&#xff0c;顾名思义&#xff0c;是一种突然发生并超过典型工作电压的过电压。一般来说&#xf…

单位、家庭建筑物电气、电子设备防雷举措

前 言 在现实的学习、工作、生活中&#xff0c;有时会面对自然灾害、重特大事故、环境公害及人为破坏等突发事件&#xff0c;为了控制事故的发展&#xff0c;就不得不需要事先制定应急预案。那要怎么制定科学的应急预案呢﹖下面是小编为大家整理的单位、住宅建筑物、电子电气防…

科学防雷接地和雷电防护方案

说到防雷&#xff0c;可能不少人首先会想到避雷针&#xff0c;而“避雷针”这一概念&#xff0c;很容易让大家对防雷的概念造成误解。 误解1: 避雷针是用来“避雷”的。 其实&#xff0c;避雷针的学名叫“接闪器”&#xff0c;不是用来“避开雷击”的&#xff0c;而是用来“迎…

通信基站防雷接地方案

由于各基站的环境和建设方式不同&#xff0c;所以对基站防雷接地不能一概而论&#xff0c;应根据具体情况采取防雷与接地措施&#xff0c; 因地制宜实施防雷接地工程&#xff0c;将基站接地系统按照均压等电位的原理进行设计和改造&#xff0c;即通信设备的工作地、保护地、防雷…

智能云防雷,信号浪涌保护器防雷接地方案

1 现代防雷的重点是信息化设备 信息技术设备是集计算机技术和微电子技术于一身的高科技技术产品&#xff0c;由大规模芯片电路组成&#xff0c;信号电压低&#xff0c;抗雷击电磁脉冲(LEMP)的能力很差&#xff0c;在闪电强磁场环境下的易损性较高。雷电已成为信息技术应用中的一…

做好防雷检测的重要意义和作用

防雷检测是一项非常重要的工作&#xff0c;它可以保障人们的生命财产安全&#xff0c;并维护国家的安全稳定。地凯科技将从防雷的重要性、防雷检测的行业应用和防雷行业国标三个方面来阐述防雷检测的重要性。 一、防雷的重要性 随着科技的不断发展&#xff0c;人们的生活和工作…

同为(TOWE)远程智能防雷预警监测——交直流遥信防雷配电柜

当前&#xff0c;社会各领域中各类先进的电子仪器广泛分布于每一个角落&#xff0c;由于高精尖电子设备的高度集成化&#xff0c;其耐压水平普遍较低&#xff0c;导致雷电流、浪涌侵入设备的风险越来越高&#xff0c;故需要在重要设备前端加装浪涌保护器&#xff08;SPD&#x…

教你学会塔罗免费占卜十八招

教你学会塔罗免费占卜十八招 塔罗牌占卜抽到不好的命运怎么办&#xff1f;#塔罗牌#塔罗牌占卜 hello&#xff0c;大家好&#xff0c;这是我的第一期文章。今天主要讲一讲在塔罗牌占卜中&#xff0c;有的时候我们会抽到不好的命运&#xff0c;不好的牌艺&#xff0c;我们该如何…

全新算命付费测算网站源码 星座运势塔罗牌牛年运程宝宝起名姻缘等

介绍&#xff1a; PHP开发的 网盘下载地址&#xff1a; http://kekewangLuo.net/BFhpbGNNy1P 图片&#xff1a;