//加载头文件
#include <winsock2.h>
#include <process.h>//线程的头文件
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")//socket的文件
#include <STDIO.H>
//定义一些常量
#define PORT 8585 //端口
//输入输出的一些内容的字符长度
#define MAX_SIZE 1000
//聊天群 定义一个最大的人数的加入
#define Max 5
//在这个数组中我们定义了
//这个数组是有所有的客户端的socket 也就是拿到他们的socket之后放在一个数组,然后如果有人发信息了,
//那么把这信息发给数组中的所有客户端用户除了 他自己本身
SOCKET fdt[Max]={0};
//接收的数据
char recvinfo[1024];
//处理的一个线程
void *pthread_service(void* sfd)
{
printf("处理数据了呢 ^V^\n");
//接收传入的socket
SOCKET fd=*(SOCKET *)sfd;
//循环输出
while(1)
{
int size;
size=recv(fd,recvinfo,MAX_SIZE,0);
if(size<=0){
int i=0;
for(i=0;i<Max;i++){
if(fd==fdt[i]){
fdt[i]=0;
}
}
break;
}
//发送信息
sendT(fd,recvinfo,size);
}
closesocket(fd);
}
int sendT(SOCKET fd,char* buf,int Size)
{
int i;
//遍历所有的客户端 不给没有的 不给自己发送
for(i=0;i<Max;i++){
if((fdt[i]!=0)&&(fdt[i]!=fd)){
//发送信息
send(fdt[i],buf,Size,0);
send(fdt[i],"\n",sizeof("\n"),0);
}
}
return 0;
}
SOCKET create_server(){
struct sockaddr_in server;
//第一步创建一个socket
SOCKET listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//判断是否不为-1
if(listenfd == INVALID_SOCKET){
printf("listenfd 创建失败\n");
exit(1);//错误退出
}
//第二步 bind一个地址 先创建一个结构体server
//对结构体进行清空内容,防止里面有内容
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
//INADDR_ANY是任意的地址都可以进行连接
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == SOCKET_ERROR) {
printf("Bind 失败\n");
exit(1);
}
//listen这个函数第二个参数并不确定是啥
//设置监听并且判断返回值
if(listen(listenfd,5) == SOCKET_ERROR){
printf("监听失败 \n");
exit(1);
}
return listenfd;
}
int main()
{
//这个是开启socket服务的函数以及操作
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data)!= 0)
{
return 0;
}
//定义二个socket 服务器端和客户端
SOCKET listenfd, connectfd;
//构造客户端的socket
struct sockaddr_in client;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
//fd是连接后的socket对象
SOCKET fd;
//创建一个服务器socket
listenfd=create_server();
//服务器成功启动
printf("服务器成功启动 ^V^ \n");
int n=0;//当前连接的人数
while(1)
{
printf("连接客户中\n");
//连接客户端 ,并且判断返回的客户端的信息client
fd = accept(listenfd,(struct sockaddr *)&client,&sin_size);
printf("连接一个客户了\n");
send(fd,"你好,已经成功加入聊天室,如他们一起聊天吧^V^ \n",sizeof("你好,已经成功加入聊天室,如他们一起聊天吧^V^ \n"),0);
if(n == Max-1){
//这里是设置的一个最大客户端的数量 也可以不设置 ,都没有关系
printf("客户端超出次数\n");
closesocket(fd);
}
int i;
//加入到共享的数组中
fdt[n]=fd;
//开启线程处理
_beginthread(pthread_service,0,&fd);
n=n+1;
}
//关闭服务
closesocket(listenfd);
WSACleanup();
}
window c语言编写的多线程的Socket局域网聊天室
需积分: 50 151 浏览量
2019-01-04
00:51:39
上传
评论 15
收藏 87KB ZIP 举报
to方圆圆
- 粉丝: 44
- 资源: 5
最新资源
- 基于python开发的口红色号识别程序+源码+开发文档+源码解析(毕业设计&课程设计&项目开发)
- TP-LINK TL-WN725N V3 Linux 驱动
- 020ssm-jsp-mysql班级同学录网站.zip(可运行源码+数据库文件+文档)
- 什么是stm32f103rct6,有哪些优缺点?
- 李明哲尚能2.zip
- 019ssm-jsp-mysql奥迪维修保养服务管理系统.zip(可运行源码+数据库文件+)
- AB测试数据-增设中小店铺广告位
- YOLOv8红外场景的车辆-行人-斑马线-交通灯检测+数据集+pyqt界面
- 基于JSP毕业设计-OA办公自动化系统-毕业设计.zip
- 基于JSP毕业设计-MVC设计模式应用之游戏卡在线销售系统(论文).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈