#include "stdio.h"
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#define SERVERIP "100.2.252.54"
#define SERVERPORT 6666
#include<windows.h>
#include<iostream>
//接收文件函数
int RecvFile(SOCKET sock,char file_name_into[10]);
//转发文件函数
int SendFile(SOCKET sock,char filename[512]);
//是否在接收文件标志
int is_recFile=0;
void Show_txt(char tj);
struct Clients_Socket{
char IP[20];
char Name[40];
SOCKET sClient;
char buf[512];
char other[10];
};
//定义结构体数组
struct Clients_Socket clients[100];//一百个客户端
int Status=0;
int clientsize=0;
HANDLE handel[100];
int first=0;
//文件存储
FILE *fp;
//原来
int ret;
char sendBuf[512],recvBuf[512];
WSADATA data;
SOCKET sockListen,sockTongxun;
struct sockaddr_in addrServer,cli;
int len;
//是否打开聊天显示
int is_open=1;
//接送消息并转发函数//***********//
DWORD WINAPI rev(LPVOID lpParameter)
{
int xx=0;
int Fileing=0;
int socketid=0;
socketid=clientsize;
char recvb[512];
//ke
int qw=1;
while(1){
memset(recvb,0,sizeof(recvb));
//接送函数
if(Fileing==0){ //判断是否在进行发送文件操作
ret= recv(clients[socketid].sClient,recvb,sizeof(recvb),0);
if(ret<1){//判断客户端是否关闭
printf("客户端已关闭socket(%d\n)",socketid);
clients[socketid].sClient=-1;
break;
}
}else{printf("正在发送文件...\n");continue;}
char bb[512];
strcpy(bb,recvb);
//
char s[512];
memset(s,0,sizeof(s));
s[0]='#';
s[1]=(char)socketid+65;
s[2]='#';
s[3]=':';
//存放用户名
for(int ii=4;ii<strlen(bb)+4;ii++){
s[ii]=bb[ii-4];
}
//判断是否有私聊指令
if(strlen(bb)>5){ //********************************私聊功能****************************************//
int index0=0,index1=0,index2=0;
int in0=0,in1=0,in2=0,in3=0;
int sl0=0,sl1=0,sl2=0,sl3=0;
index0=(bb[0]=='s');//私聊判断
index1=(bb[1]=='t');
index2=(bb[2]=='o');
sl0=(bb[0]=='s');//查询在线客户端情况
sl1=(bb[1]=='h');
sl2=(bb[2]=='o');
sl3=(bb[3]=='w');
in0=(bb[0]=='f');//文件判断
in1=(bb[1]=='i');
in2=(bb[2]=='l');
in3=(bb[3]=='e');
int index3=bb[3];
if(index0==1&&index1==1&&index2==1)
{//是私聊信息
//解密对方要发送私聊给谁
//私聊
if((index3-65<clientsize)&&(clients[index3-65].sClient!=-1)){///////////////////*****昨天
//printf("私聊对象是%d\t客户端:%d\t在线客户端%d\n",index3,socketid,clientsize);
if(socketid!=index3-65){ //私聊的不是自己
//printf("index3=%d",index3-65);
send(clients[index3-65].sClient,s,strlen(s),0);
//文件保存
fp = fopen( "F:\\record.txt" , "a" );
fwrite(s, strlen(s)+5 , 1, fp );
fprintf(fp,"\n");
fclose(fp);
if(is_open==1){
printf("私聊->%s\n",s);}}
else{ //不可以私聊自己
char no_sl[512]={"#服务器提醒#:不可私聊自己!"};
send(clients[socketid].sClient,no_sl,strlen(no_sl),0);
printf("\n不能私聊自己\n");
printf("不能私聊自己");}
}else if(clients[index3-65].sClient==-1){
//私聊对象已下线
char out_online[512];
memset(out_online,0,sizeof(out_online));
strcpy(out_online,"#服务器#:对方已下线,无法私聊!");
send(clients[socketid].sClient,out_online,strlen(out_online),0);
}
else if(index3-64>clientsize&&clients[index3-65].sClient!=-1){//******************************************************************************昨天
printf("------(%d)\n",index3-65);
//私聊时,对方不在线;///////////////////////////////**********私聊对方,对方不在线***************///////////////////////////////
char no_sl[512];
memset(s,0,sizeof(s));
strcpy(no_sl,"#服务器#:对方不在线,无法私聊!");
send(clients[socketid].sClient,no_sl,strlen(no_sl),0);
}
} else if((in0==1&&in1==1&&in2==1&&in3==1)){ //********************************文件发送功能********************//
char persion=bb[4];
int File_len= strlen(bb);
char File_an[512];//发送的文件路径即文件名
char File_type[10];
printf("\n需要转发给客户端%c\t对应结构体数组=%d\n",persion,persion-65);
//初始化数组
memset(File_an,0,sizeof(File_an));
memset(File_type,0,sizeof(File_type));
for(int i=0;i<File_len-5;i++){
File_an[i]=bb[i+5];
}
File_type[6]=bb[File_len-1];
File_type[5]=bb[File_len-2];
File_type[4]=bb[File_len-3];
File_type[3]=bb[File_len-4];
char F1=(rand()%25)+65;
char F2=(rand()%25)+65;
char F3=(rand()%25)+65;
File_type[2]=F1;
File_type[1]=F2;
File_type[0]=F3;
//printf("发送的文件路径、是%s\t文件类型是%s\n",File_an,File_type);
Fileing==1;
int cx=1; //**************************开始接收文件********************//
cx=RecvFile(clients[socketid].sClient,File_type);
while(1){
if(cx==0){
if(clients[persion-65].sClient>0&&clients[persion-65].sClient!=-1){ //******************转发文件给客户端*************************//
send(clients[persion-65].sClient,bb,strlen(bb),0);
//
SendFile( clients[persion-65].sClient,File_type);
}else{
printf("\n对方客户端不在线,不能转发发送文件\n");
char no_sl[512];
memset(s,0,sizeof(s));
strcpy(no_sl,"#服务器#:对方不在线,文件发送失败!!");
send(clients[socketid].sClient,no_sl,strlen(no_sl),0);
}
Fileing==0;
break;
}
}
}
else if(sl0==1&&sl1==1&&sl2==1&&sl3==1){ //***************************查询客户端在线情况******************//
//客户端发来信息,要查询谁在线;
if(bb[4]=='m'&&bb[5]=='e'){ //查询自己客户端情况
char online[512];
memset(online,0,sizeof(online));
online[0]='m';
online[1]='e';
online[2]=':';
online[3]='[';
online[4]=socketid+65;
online[5]=']';
send(clients[socketid].sClient,online,strlen(online),0);
}
else{ //查询所有客户端情况
char online[512];
memset(online,0,sizeof(online));
online[0]='o';
online[1]='n';
online[2]='l';
online[3]='i';
online[4]='n';
online[5]='e';
online[6]=':';
int size=7;
for(int i=0;i<100;i++){
if(clients[i].sClient>0&&clients[i].sClient!=-1){
//printf("在线客户端:%c\tClient=:%d\tIP地址:%s\n",(i+65),clients[i].sClient,clients[i].IP);
online[size]='[';
online[size+1]=char(i+65);
online[size+2]=']';
online[size+3]=',';
size=size+4;
}
}
send(clients[socketid].sClient,online,strlen(online),0);
}
}
else{ //不是私聊信息
int one_jilu=1;
int clients_online=0;//群聊人数
for(int i=0; i<100;i++){
if(clients[i].sClient>0&&clients[i].sClient!=-1){
if(clients[i].sClient!=clients[socketid].sClient){
ret=send(clients[i].sClient,s,strlen(s),0);
clients_online++;
if(one_jilu==1){//群聊记录在服务器只显示一次
//文件保存
fp = fopen( "F:\\record.txt" , "a" );
fwrite(s, strlen(s)+5 , 1, fp );
fprintf(fp,"
评论6