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

前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客户机负责发送消息并打印收到的消息.

编程模型
服务端s                        客户端c
创建套接字(socket)           创建套接字(socket)
准备地址(自己的)               准备地址(服务器的,为连接准备)
绑定地址与socket
设置监听socket
等待连接                        连接服务器
接受消息                        发送消息
发送消息                        接收消息
关闭套接字                   关闭

客户端

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <pthread.h>
#include <signal.h>int sockfd;void sigint(int signum)
{close(sockfd);puts("退出聊天!");exit(0);
}void* start(void* p)
{int fd =*(int*)p;while(1){char buf[1024] = {};if (0 >= recv(fd,buf,sizeof(buf),0) ){return NULL;}printf("\r%s\n",buf);}
}int main()
{system("clear");signal(SIGINT,sigint);signal(SIGQUIT,sigint);//创建socket对象int sockfd = socket(AF_INET,SOCK_STREAM,0);if(0>sockfd){perror("socket");return -1;}//准备通信地址struct sockaddr_in addr ={};addr.sin_family = AF_INET;addr.sin_port = htons(1703);//端口号addr.sin_addr.s_addr = inet_addr("192.168.1.118");//本地ip//连接if(0>connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))){perror("connect");return -1;}pthread_t pid;pthread_create(&pid,0,start,&sockfd);//发送数据while(1){char buf[1024] ={};char srt[255]={};//printf(">>>");gets(srt);sprintf(buf,"\33[;44m%s\33[0m",srt);send(sockfd,buf,strlen(buf)+1,0);}}

服务器端

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>typedef struct sockaddr SockAddr;
int fds[20];
char ip[20][20];
int size = 20;void sigint(int signum)
{for(int i=0;i<size;i++){close(fds[i]);}puts("客户端已关闭!");exit(0);
}void* start(void* p)
{//向所有聊天室成员 提示新用户来了int fd =*(int*)p;char buf3[1024] = {};int index = 0;for(int i=0;i<size;i++){if(fds[i] == fd){index = i;break;}}sprintf(buf3,"\33[;45m%s %s\33[0m ","欢迎",ip[index]);for (int i=0;i<size;i++){if (fds[i]!=0 && fds[i]!=fd){printf("send to %d\n",fds[i]);send(fds[i],buf3,strlen(buf3)+1,0);}}// 收发数据while(1){char buf1[1024] = {};char buf2[1024] = {};//接受信息小于零,则用户退出if (0 >= recv(fd,buf1,sizeof(buf1),0)){//退出后将位置空出来for (int i=0;i<size;i++){if (fd == fds[i]){fds[i] = 0;break;}}//提示用户退出sprintf(buf2,"%s \33[;31m%s\33[0m ",ip[index],"已经退出!");puts(buf2);int i;for ( i=0;i<size;i++){if (fds[i]!=0 && fds[i]!=fd)send(fds[i],buf2,strlen(buf2)+1,0);}send(fds[i],buf2,strlen(buf2)+1,0);//结束线程pthread_exit((void*)i);}//向所有用户发送信息printf("%s:%s\n",ip[index],buf1);     sprintf(buf2,"\33[;42m%s\33[0m %s:%s","recv",ip[index],buf1);for (int i=0;i<size;i++){if (fds[i]!=0 && fds[i]!=fd){printf("send to %d\n",fds[i]);send(fds[i],buf2,strlen(buf2)+1,0);}}}  }int main()
{signal(SIGINT,sigint);signal(SIGQUIT,sigint);// 创建socket对象int sockfd = socket(AF_INET,SOCK_STREAM,0);if(0 > sockfd){perror("socket");return -1;}// 准备通信地址struct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = htons(1710);addr.sin_addr.s_addr = inet_addr("192.168.1.117");// 绑定socket对象与通信地址socklen_t len = sizeof(addr);if(0 > bind(sockfd,(SockAddr*)&addr,len)){perror("bind");return -1;}// 设置监听socket对象listen(sockfd,size);// 等待连接while(1){struct sockaddr_in from_addr;int fd = accept(sockfd,(SockAddr*)&from_addr,&len);if(0 > fd){printf("客户端连接出错...\n");continue;}int i;for (i=0;i<size;i++){if (fds[i] == 0){//记录客户端的socketfds[i] = fd;//有客户端连接之后,启动线程给此客户服务pthread_t pid;pthread_create(&pid,NULL,start,&fd);strcpy(ip[i],inet_ntoa(from_addr.sin_addr));printf("客户端:%s连接成功!\n",ip[i]);break;}}if (size == i){//发送给客户端说聊天室满了char* str = "对不起,聊天室已经满了!";send(fd,str,strlen(str),0); close(fd);}}
}

C语言实现网络聊天室 socket的简单应用相关推荐

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

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

  2. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  3. 使用socket实现基于select模型的网络聊天室

    假期闲来无事,便写了个小小的网络聊天室程序.以前一直都是写MFC的有界面的程序,时间长了,便失去了兴趣,感觉有些东西经过MFC的封装,反而失去了意义,让人学不到东西,所以,丢开MFC那层的东西,直接使 ...

  4. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  5. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

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

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

  7. 基于Socket通信的在线网络聊天室

    文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...

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

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

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

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

最新文章

  1. SpringSecurity-短信验证码接口开发
  2. extjs年月日时分选择控件_UI设计|网站公共控件及交互事件
  3. 会话,授权,认证概念解析
  4. Event Handling Guide for iOS——由触摸事件传递想到的
  5. Android中图片的处理(放大缩小,去色,转换格式,增加水印等)(转)
  6. 还对Angel平台一知半解?腾讯专家为你指点迷津!
  7. Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
  8. XamarinEssentials教程应用程序信息AppInfo
  9. matlab2c使用c++实现matlab函数系列教程-pascal函数
  10. 点名软件—使用二项分布实现点名均匀分布
  11. mkfs.ext3 快速格式化_求救!固态硬盘格式化不了!
  12. Linux---带你区分根目录 和 家目录
  13. P3435 [POI2006]OKR-Periods of Words [Kmp, next数组]
  14. 两步免费开通企业微信,不用提交资料
  15. HTML5开发工具有哪些?
  16. python中的str()函数
  17. Ajax请求的五大步骤——一看就会
  18. python 发送邮件connect none_python发送邮件(smtplib)
  19. Echarts可视化 之custom自定义系列
  20. AAC 音频数据的两种格式

热门文章

  1. 专业音频工具au 2019 mac 直装版——Audition CC 2019 for Mac 12.1.0.182中文特别版
  2. Nmap 基本使用方法
  3. python 京东 抢券_Python写一个京东抢券脚本
  4. 模拟测静电场实验报告
  5. 亏麻了,华为离职后年终奖照旧发。。
  6. Android Architecture(Is Activity God?)
  7. 荧光猝灭剂BHQ-1 acid/NHS/azide/amine/BHQ染料染料
  8. 读书有益——》从你的全世界路过
  9. XML简介及两种C#读取方式
  10. 一个u盘大小的树莓派就能搭建一个服务器