基于TCP/IP的局域网聊天室---C语言
具备注册账号,群聊,查看在线人员信息,私发文件和接收文件功能,因为每个客户端只有一个属于自己的socket,所以无论客户端是发聊天消息还是文件都是通过这一个socket发送,
这也意味着服务器收发任何消息或文件都只能有一个select函数也意味着只能有一个收发消息的线程。
所以我定义了一个通用结构体:
struct snd{
char msg[30]; //消息性质,同时也是普通聊天消息..
int soc; //套接字
int count; //用户账号
char filename[20]; //文件发送时的文件名
int size; //文件大小
char buffer[1024]; //每次fread读取文件时的大小
};
第一个字符串msg时用来保存消息的性质,是聊天消息 还是文件发送消息 还是菜单命令消息,我的处理方法有点"偷懒",应该是有点蠢..
因为文件发送时msg保存的字符串就是"FILE",服务器只要判断它的字符串是"FILE"就认为它时文件消息并把它转发给指定客户端。
而msg[30]在结构体是聊天消息的情况下保存的就是聊天的消息,如果msg不是我指定的字符串的话服务器就会把它当聊天消息转发,所以如果我在聊天室输入"FILE"并发送…你懂的,BUG就出现了。
。
收发文件我是在服务器收发线程中加入文件收发的函数,判断收到的是文件就跳入此函数,所以可能会出现两个客户端发送接收文件时其他客户端群聊消息接收有延迟,不过我没测试过….
瑕疵很多,还有很多需要改进的地方,望各位前辈海涵。
上代码:
服务器↓

客户端↓

基于TCP/IP的局域网聊天室---C语言的更多相关文章
- 基于EPOLL模型的局域网聊天室和Echo服务器
		一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说sel ... 
- TCP/IP以及Socket聊天室带类库源码分享
		TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ... 
- JAVA基础知识之网络编程——-基于TCP通信的简单聊天室
		下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ... 
- 基于Qt的P2P局域网聊天及文件传送软件设计
		基于Qt的P2P局域网聊天及文件传送软件设计 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<通信网络>的课程设计作业,之 ... 
- 基于LINUX的多功能聊天室
		原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来 ... 
- C# 异步通信 网络聊天程序开发 局域网聊天室开发
		Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ... 
- 基于 OpenResty 实现一个 WS 聊天室
		基于 OpenResty 实现一个 WS 聊天室 WebSocket WebSocket 协议分析 WebSocket 协议解决了浏览器和服务器之间的全双工通信问题.在WebSocket出现之前,浏览 ... 
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
		基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ... 
- 基于TCP/IP协议的C++网络编程(API函数版)
		源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ... 
随机推荐
- C++ Deque(双向队列)
			C++ Deque(双向队列)是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的 ... 
- VSTO 开发中 应用ActionPane、CustomTaskPane
			以Excel插件为例: 1. ActionPane 创建 ThisWorkbook 项目 private void ThisWorkbook_Startup(object sender, System ... 
- Windows 实用小工具
			超实用的Windows工具 ====================================================================================== ... 
- February 20 2017 Week 8 Monday
			Behind every beautiful thing, there's some kind of pain. 美丽背后,必有努力. No pains, no gains, and sometime ... 
- 028class_part2
			1.成员修饰符 2.特殊成员 3.metaclass,类的祖宗 ###成员修饰符###公有和私有 #__author:_nbloser #date:2018/1/19 #私有类.对象成员 ... 
- python UI自动化实战记录十一: 总结
			首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ... 
- java学习第一步,使用IntelliJ IDEA编写自己的第一个java程序
			首先下载java的jdk,然后说一下IDEA的配置 IntelliJ IDEA目前公认的最好的java开发工具,不过一般的学校的教学还是使用eclipse来进行java的开发.所以老师一般只会教你如何 ... 
- 【转】九步学习python装饰器
			本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白 ... 
- 【[USACO12FEB]附近的牛Nearby Cows】
			我记得我调这道题时中耳炎,发烧,于是在学长的指导下过了也没有发题解 发现我自己的思路蛮鬼畜的 常规操作:\(f[i][j]\) 表示到\(i\)的距离为\(j\)的奶牛有多少只,但注意这只是在第二遍d ... 
- docker-3-常用命令(中)
			容器命令 1.有镜像才能创建容器,这是根本前提(下载一个CentOS镜像演示) docker pull centos 2.新建并启动容器 docker run [OPTIONS] IMAGE [COM ... 
