📄 client_server.cpp
字号:
}
}
nResult=closesocket(s); //关闭套接字。
if(nResult==SOCKET_ERROR)
{
printf("8.关闭套接字(服务器端)失败!\n");
}
}
void chatting_client(SOCKET sc)
{
system("cls");
system("color 0a");
int receiveLength;
char SMess[1000]; //发送消息的缓存
char RMess[1000]; //接收消息的缓存
char SName[200]; //服务端用户的姓名
char CName[200]; //客户端用户的姓名
int nResult;
nResult=recv(sc,RMess,strlen(RMess),0); //确认文件传送模块连接成功
if( nResult== -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return ;
}
printf("%s\n",RMess);
printf("请输入你的名字:"); //客户端用户的姓名
gets(CName);
while(strlen(CName)==0)
{
printf("用户名不能为空! 请输入你的名字:\n");
gets(CName);
}
send(sc,CName,strlen(CName)+1,0); //向服务端发送姓名
receiveLength=recv(sc,SName,200,0); //接收服务端用户的姓名
if(receiveLength==-1) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return ;
}
printf("你已和%s取的连接……\n",SName);
printf("开始聊天(输入exit退出聊天程序)……\n");
while(1)
{
struct tm *local;
time_t t; //调用时间函数,显示用户的操作时间
t=time(NULL);
local=localtime(&t);
nResult=recv(sc,RMess,M,0); //接收服务端发送过来的消息
if(nResult == -1) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return ;
}
if(strcmp(RMess,"exit")==0)
{
printf("服务端已退出聊天程序,本程序也即将退出!\n");
system("pause");
break;
}
printf("%s\t%d:%d:%d \n %s\n",SName,local->tm_hour,local->tm_min,local->tm_sec,RMess);
printf("\n请输入信息:"); //客户端用户输入消息
gets(SMess);
if(strcmp(SMess,"exit")==0)
{
send(sc,SMess,strlen(SMess)+1,0);
printf("你已退出聊天程序!\n");
system("pause");
break;
}
//服务端显示自己的消息
t=time(NULL);
local=localtime(&t);
printf("\r%s\t%d:%d:%d \n %s\n",CName,local->tm_hour,local->tm_min,local->tm_sec,SMess);
send(sc,SMess,strlen(SMess)+1,0);
}
}
void sendFile(SOCKET ss)
{
char *str1="....确认成功....";
send(ss,str1,strlen(str1)+1,0); //向客户端发送验证信息
FILE *fp;
long i; //文件分的的块数
char fileAddr[300];
char fileName[100];
dmm:
printf("请输入要传送的文件绝对地址(含文件名):");
gets(fileAddr);
if( (fp=fopen(fileAddr,"rb")) == NULL) //打开文件
{
printf("文件地址输入错误!\n");
goto dmm;
}
getW_name(fileAddr,fileName);
send(ss,fileName,strlen(fileName)+1,0); //发送文件名
fseek(fp,0L,2);
long fileLength=ftell(fp); //取得文件的长度
fseek(fp,0L,0);
char Length[100];
LongToChar(fileLength,Length);
send(ss,Length,strlen(Length)+1,0); //发送文件大小到客户端
if( 0 == fileLength%M ) //对文件进行分块
{
i=fileLength/M;
}
else
{
i=fileLength/M+1;
}
char mess[M];
long readLength; //从文件读取的长度
long sendLength; //发送文件的长度
int k=1; //正在传送的模块号
char *temp="开始接收文件"; //向客户端开始传送,确认同步开始
int nResult;
nResult=recv(ss,mess,M,0);
if(nResult == -1 ) //判断客户端是否关闭
{
printf("\n客户端已断开\n");
system("pause");
return ;
}
send(ss,temp,strlen(temp)+1,0);
printf("%s,共 %ld 模块:\n",mess,i);
long total=0;
while( k <= i )
{
Sleep((DWORD)800); //此非常重要,降低了传输时间,保证了两边的同步
readLength=fread(mess,sizeof(char),M,fp);
sendLength=send(ss,mess,readLength,0);
total+=sendLength;
printf("\r第 %d 模块 读取:%ldB 发送:%ldB",k,readLength,sendLength);
printf(" 进度: %2.2f%c 模块:%ld / %ld",100*(total*1.0/fileLength),37,k,i);
if(sendLength==SOCKET_ERROR)
{
printf("失败!");
}
k++;
}
fclose(fp);
printf("\n文件发送完成!\n");
system("pause");
}
void chatting_server(SOCKET s_d)
{
system("color 0a");
char *str1="你同意了……";
send(s_d,str1,strlen(str1)+1,0);
int receiveLength; //接收消息的长度
char SMess[1000]; //发送消息的缓存
char RMess[1000]; //接收消息的缓存
char SName[200]; //服务端用户的姓名
char CName[200]; //客户端用户的姓名
receiveLength=recv(s_d,CName,200,0);
if(receiveLength==-1) //判断客户端是否关闭
{
printf("客户端已断开\n");
system("pause");
return ;
}
printf("你已和%s取的连接……\n",CName);
printf("请输入你的名字:");
gets(SName);
while(strlen(SName)==0) //循环检测用户名是否合法
{
printf("用户名不能为空! 请输入你的名字:\n");
getchar();
gets(SName);
}
send(s_d,SName,strlen(SName)+1,0); //向客户端发送姓名
printf("\n开始聊天(输入exit退出聊天程序)……\n");
while(1)
{
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
printf("\n\n请输入信息:");
gets(SMess);
if(strcmp(SMess,"exit")==0) //用户输入‘exit’退出程序
{
send(s_d,SMess,strlen(SMess)+1,0);
printf("你已退出聊天程序!\n");
system("pause");
break;
}
//在服务端显示自己的消息
printf("\r%s\t%d:%d:%d\n %s\n",SName,local->tm_hour,local->tm_min,local->tm_sec,SMess);
send(s_d,SMess,strlen(SMess)+1,0);
//在服务端显示客户端消息
t=time(NULL);
local=localtime(&t);
receiveLength=recv(s_d,RMess,M,0);
if(receiveLength==-1) //判断客户端是否关闭
{
printf("客户端已断开\n");
system("pause");
return ;
}
if(strcmp(RMess,"exit")==0)
{
printf("\n客户端已退出聊天程序,本程序也即将退出!\n");
system("pause");
break;
}
printf("\n%s\t%d:%d:%d\n %s\n",CName,local->tm_hour,local->tm_min,local->tm_sec,RMess);
}
}
void getW_name(char waddr[],char wname[])
{
int i,k=0,j,w_len=strlen(waddr);
for(i=w_len-1;i>=0;i--)
{
if(waddr[i]=='\\')
break;
wname[k++]=waddr[i];
}
wname[k++]='\0';
i=strlen(wname);
for(j=0,k=i-1;j<i/2;j++,k--)
{
char temp=wname[j];wname[j]=wname[k];wname[k]=temp;
}
}
int receiveFile(SOCKET sc)
{
system("color 0a");
int nResult;
char mess[M];
nResult=recv(sc,mess,strlen(mess),0); //确认文件传送模块连接成功
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
printf("%s\n",mess);
char fileName[50];
nResult=recv(sc,fileName,50,0); //接收文件名
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
nResult=recv(sc,mess,M,0); //接受文件的大小
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
long fileLength=StrToLong(mess); //取的待传送文件的长度
long i; //存放文件块数
if( 0 == fileLength%M ) //对文件按N单位进行分块
{
i=fileLength/M;
}
else
{
i=fileLength/M+1;
}
FILE *fp; //打开文件
int k=1; //当前正在接收文件的块数
long receiveLength; //接收文件的长度
long writeLength; //已写到文件的字符长度
fp=fopen(fileName,"wb");
char *temp="开始传送文件";
send(sc,temp,strlen(temp)+1,0); //向客户端开始传送,确认同步开始
nResult=recv(sc,mess,M,0); //接收服务端的确认消息
if(nResult == -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
printf("%s,共 %ld 模块:\n",mess,i);
long total=0; //已接收文件的长度
while(k<=i) //循环的接收文件
{
receiveLength=recv(sc,mess,M,0);
if( receiveLength== -1 ) //判断服务端是否关闭
{
printf("\n服务端已断开\n");
system("pause");
return 0;
}
writeLength=fwrite(mess,sizeof(char),receiveLength,fp);
printf("\r第 %d 模块 接收:%ldB 写入:%ldB",k,receiveLength,writeLength);
total+=writeLength;
printf(" 进度: %2.2f%c 模块:%ld / %ld",100*(total*1.0/fileLength),37,k,i);
k++;
}
fclose(fp);
printf("\n文件接收完成!\n");
system("pause");
return 0;
}
void LongToChar(long x,char a[])
{
int count=0;
if(x==0)
return;
while(x)
{
a[count++]=x%10+'0';
x=x/10;
}
a[count]='\0';
for(int i=0,j=count-1;i<count/2;i++,j--)
{ char temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;}
}
long StrToLong(char str[])
{
long result;
bool bEnd;
bEnd = true;
result = 0;
for ( int i = 0; bEnd; i++ )
{
if (str[i] != '\0' && str[i] >= '0' && str[i] <= '9')
{
result = result * 10 + str[i] - '0';
}
if (str[i] == '\0')
{
bEnd = false;
}
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -