【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,再运行客户端连接服务端,再不断加入客户端,注意最大加入数
运行结果:
想得美,直接动手
【C语言】实现简易网络聊天室相关推荐
- java实现一个简易网络聊天室
题目要求 基本功能(必须实现和遵循的要求) 1.要求项目服务器端能稳定持续接收进入聊天室的人员,并能够在聊天室实时更新在线人数. 2.客户端可以持续不断的给服务器发送消息,中间不能丢失任何一条信息. ...
- 利用C语言编写简易的网络聊天室
网络聊天室 业务逻辑: 1.客户端注册名字 2.告诉所有在线的客户端,XXX进入聊天室 3.新建一个线程为该客户端服务,随时接收客户端发送来的消息 4.当接收到一个客户端的消息时,向每一个客户端转发一 ...
- C语言实现网络聊天室 socket的简单应用
C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...
- 基于TCP的网络聊天室实现(C语言)
基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...
- 简易QQ聊天室,socket多线程编程(C语言实现),简单易懂
简易QQ聊天室 实现本功能,仅需了解socket套接字的使用,我已经将socket套接字的监听接受状态封装在了common.c中,相信你看了会有所收获,socket的连接也封装在common.c中. ...
- c语言课程设计 聊天室,网络聊天室C课程设计
网络聊天室C课程设计 网络聊天室C课程设计 using System.Reflection; using System.Runtime.CompilerServices; [assembly: Ass ...
- [源码和文档分享]基于java语言的C/S模式网络聊天室软件
一 需求分析 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能 分为三大模块:客户端模块.服务器端模块和公共辅助类模块 客户端模块的主要功能: 登陆功能:用户可以注册 ...
- 网络聊天室(linux,java,Android)
如果追忆会荡起涟漪,那么今天的秋红落叶和晴空万里都归你 艾恩凝 个人博客 https://aeneag.xyz/ 前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了 ...
- [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具
文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...
- python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...
实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...
最新文章
- 我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)...
- python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
- java随机生成6位随机数 5位随机数 4位随机数
- java 类的重载_Java自学-类和对象 方法重载
- ML.NET 0.8特性简介
- Oracle 实验7 存储过程
- 9600波特率每秒传送多少字节_arduino传送字符串json到python解析为字典数据
- SQL大全------之 oracle关于insert all的用法
- Message no. C6015--No valuation variant found for valuation area xxxx
- 操作系统课后答案第三章
- USACO3.4.3 Raucous Rockers (rockers)
- 计算机上打印机删除不了怎么办,打印任务无法删除怎么办?
- 数据库原理及安全技术教学实验报告SQL实践(一)
- php warning: file_get_contents,解决PHP Warning: file_get_contents failed to open stream
- mac下配置Charles,安装证书
- 为CIFAR图片分类模型添加BN
- 客户流失预测_如何不预测和防止客户流失
- C++ 20 std::chrono 库使用 | std::chrono::year_month_day |std::chrono::hh_mm_ss 使用
- Python创建一定长度的列表_一定维度的列表_综合最快
- go Benchmark的运行