项目:

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

知识点:

总体框架:

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语言】实现简易网络聊天室相关推荐

  1. java实现一个简易网络聊天室

    题目要求 基本功能(必须实现和遵循的要求) 1.要求项目服务器端能稳定持续接收进入聊天室的人员,并能够在聊天室实时更新在线人数. 2.客户端可以持续不断的给服务器发送消息,中间不能丢失任何一条信息. ...

  2. 利用C语言编写简易的网络聊天室

    网络聊天室 业务逻辑: 1.客户端注册名字 2.告诉所有在线的客户端,XXX进入聊天室 3.新建一个线程为该客户端服务,随时接收客户端发送来的消息 4.当接收到一个客户端的消息时,向每一个客户端转发一 ...

  3. C语言实现网络聊天室 socket的简单应用

    C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...

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

    基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...

  5. 简易QQ聊天室,socket多线程编程(C语言实现),简单易懂

    简易QQ聊天室 实现本功能,仅需了解socket套接字的使用,我已经将socket套接字的监听接受状态封装在了common.c中,相信你看了会有所收获,socket的连接也封装在common.c中. ...

  6. c语言课程设计 聊天室,网络聊天室C课程设计

    网络聊天室C课程设计 网络聊天室C课程设计 using System.Reflection; using System.Runtime.CompilerServices; [assembly: Ass ...

  7. [源码和文档分享]基于java语言的C/S模式网络聊天室软件

    一 需求分析 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能 分为三大模块:客户端模块.服务器端模块和公共辅助类模块 客户端模块的主要功能: 登陆功能:用户可以注册 ...

  8. 网络聊天室(linux,java,Android)

    如果追忆会荡起涟漪,那么今天的秋红落叶和晴空万里都归你 艾恩凝 个人博客 https://aeneag.xyz/ 前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了 ...

  9. [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具

    文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...

  10. python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...

    实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...

最新文章

  1. 我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)...
  2. python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
  3. java随机生成6位随机数 5位随机数 4位随机数
  4. java 类的重载_Java自学-类和对象 方法重载
  5. ML.NET 0.8特性简介
  6. Oracle 实验7 存储过程
  7. 9600波特率每秒传送多少字节_arduino传送字符串json到python解析为字典数据
  8. SQL大全------之 oracle关于insert all的用法
  9. Message no. C6015--No valuation variant found for valuation area xxxx
  10. 操作系统课后答案第三章
  11. USACO3.4.3 Raucous Rockers (rockers)
  12. 计算机上打印机删除不了怎么办,打印任务无法删除怎么办?
  13. 数据库原理及安全技术教学实验报告SQL实践(一)
  14. php warning: file_get_contents,解决PHP Warning: file_get_contents failed to open stream
  15. mac下配置Charles,安装证书
  16. 为CIFAR图片分类模型添加BN
  17. 客户流失预测_如何不预测和防止客户流失
  18. C++ 20 std::chrono 库使用 | std::chrono::year_month_day |std::chrono::hh_mm_ss 使用
  19. Python创建一定长度的列表_一定维度的列表_综合最快
  20. go Benchmark的运行

热门文章

  1. 完全演示在虚拟机中装Windows7
  2. 课工场论坛列表发帖制作
  3. windows系统用cmd命令开启WiFi共享功能
  4. java 初始化duration_Java Duration toMinutes()用法及代码示例
  5. 六、Linux常用命令之压缩打包篇(gzip、gunzip、tar、zip、bzip2)
  6. Windows与虚拟机文件夹共享的设置方法
  7. 2022年最全软件测试面试题加答案,毫不夸张的说,学完面试涨薪5K
  8. 万恶的android
  9. 中控人脸指纹考勤机怎么如何偷偷修改数据记录
  10. HardFault 异常定位