计算机网络课程设计-Socket网络通信(C++, MacOS)
实验要求:
利用Socket实现双机通信
实验目的:
利用Socket编程,采用其中的TCP面向连接方式,实现计算机数据的交换
具体要求:
- 操作系统:可在Linux或Windows操作系统下实现
- 编程语言:C或C++,若使用Java、python等更高级的语言或脚本语言则须实现下面的“扩展功能”
- 界面要求:图形界面或者命令行界面均可
- 连接方式:局域网内通信,有线或无线网络均可
- 实现功能:
- 基本功能(必做):计算机A、B(须为不同的物理机)实现文本通信,即B收到A所发送的文本并显示。
- 扩展功能(加分选做):双向通信(同一程序下,A、B既可以发送数据又可以接受数据);文本传输(B完整收到A发送的文件并保存);实现音视频传输(类似于QQ电话);其他网络拓展功能
- 验收方式等不再赘述
实现
基于C++和MacOS的实现,unix上可以正常运行,linux好像有库不支持。有关Socket的基础知识见博客网络socket编程指南,下面代码中要实现的内容有:
- 基本文本双向通信,多对多双向通信,实现私聊和群聊功能
- 文件双向传输,多对多双向传送,实现私传和群传功能
题目要求使用TCP方式,因此应该使用流式套接字。代码使用127.0.0.1测试成功,一主机对一虚拟机也测试成功了,尚未进行多台电脑之间的测试(疫情在家,买不起多台电脑)。
由于没有设计GUI,我们需要对客户端的输入格式进行规范化,如下所示:
首先输入聊天对象:
1 ID
表示私聊客户端ID,2
表示进入群聊,向包括服务端的所有人发送信息。
选择聊天对象后:
1 文本
表示发送文本信息,2 PATH
表示将PATH路径上的文件发送过去,3
表示开始视频通话(此功能尚未实现)。之后的聊天不需要输入聊天对象,默认是与此人聊天。
键入\exit
表示退出与此人的聊天,下次需要重新输入聊天对象。
键入\quit
表示退出与服务器的连接。
服务端可以对群体进行文件传输和文本发送,和上面相同,1 文本
表示发送文本信息,2 PATH
表示将PATH路径上的文件发送过去,3
表示开始视频通话(此功能尚未实现)。
暂时没有实现任意多个人之间进行聊天。代码有些杂乱,并且或多或少可能有一些bug,但是可以正常运行。我尽量抽时间整理,见谅。
运行界面
服务端
客户端1
客户端2
完整代码
服务端
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <queue>
#include <vector>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fstream>
const int BACKLOG=2; //完成三次握手但没有accept的队列的长度
const int CONCURRENT_MAX=3; //应用层同时可以处理的连接
const int BUFFER_SIZE=1024;//将被加入缓存器的最大字节数
char input_msg[BUFFER_SIZE];
char recv_msg[BUFFER_SIZE];class Socket_server{
public:Socket_server(){server_sock_fd=0;tv.tv_sec = 20;//秒tv.tv_usec = 0;//微秒max_fd=-1;memset(client_fds,0,sizeof(client_fds));memset(client_to,-1,sizeof(client_to));filename.clear(); path.clear();};~Socket_server(){};bool init(const int port);bool start();bool sendmessage();//服务器发出信息bool sendIP(int index);//发送号码表void recv_and_forward();//接收信息,同时起到中转站的作用void recv_word(int index,int byte_num);void recv_file(int index,int byte_num);void recv_video(int index);void accept_new();
private:int server_sock_fd;//服务端套接字//fd_setfd_set server_fd_set;//用来存放所有的待检查的文件描述符int max_fd;timeval tv;//struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。int client_fds[CONCURRENT_MAX+1];//客户端套接字struct sockaddr_in client_addr[CONCURRENT_MAX+1];//客户端对应的地址信息int client_to[CONCURRENT_MAX+1];//客户端想要发送的对象std::string filename;std::string path;
};
bool Socket_server::init(const int port){struct sockaddr_in server_addr;//sockaddr_in: Socket address, internet style.表示网络地址的结构体(internet和socket通用)server_addr.sin_len = sizeof(struct sockaddr_in);server_addr.sin_family = AF_INET;//socket只能用这个server_addr.sin_port = htons(port);server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// server_addr.sin_port = htons(0);//16位整数 主机字节序转网络字节序,此处为设置端口号(本机是小端存储,网络字节是大端)
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//设置本机IP地址memset(&(server_addr.sin_zero),0,8);//创建socketserver_sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_sock_fd == -1){//未能成功打开网络通讯端口perror("socket error");//输出字符串+errno对应的错误return false;}int on = 1;if(setsockopt(server_sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))==-1){//防止出现bind error的地址已被占用perror("setsockopt");return false;}//绑定socketint bind_result = bind(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));if (bind_result == -1){perror("bind error");return false;}//listenif (listen(server_sock_fd, BACKLOG) == -1){perror("listen error");return false;}printf("欢迎使用SOCKET通讯系统,输入quit并确认可退出\n");return true;
}
bool Socket_server::start()
{FD_ZERO(&server_fd_set);//标准输入FD_SET(STDIN_FILENO, &server_fd_set);//用于在文件描述符集合中增加一个新的文件描述符。STDIN_FILENO是标准输入文件描述符if (max_fd < STDIN_FILENO)//STDIN_FILENO = 0max_fd = STDIN_FILENO;//服务器端socketFD_SET(server_sock_fd, &server_fd_set);//把要检测的套接字server_sock_fd加入到集合中if (max_fd < server_sock_fd){max_fd = server_sock_fd;}//客户端连接for (int i = 1; i <= CONCURRENT_MAX; i++){if (client_fds[i]!=0){FD_SET(client_fds[i], &server_fd_set);if (max_fd < client_fds[i])//找到文件描述符中的最大值并存储max_fd = client_fds[i];}}int ret = select(max_fd+1, &server_fd_set, NULL, NULL, &tv);//检测server_fd_set中的套接字中是否有可读信息if (ret < 0){perror("select 出错");return false;}else if(ret == 0){printf("timeout...\n");return false;}return true;
}
bool Socket_server::sendmessage()
{//ret为未状态发生变化的文件描述符的个数if (FD_ISSET(STDIN_FILENO, &server_fd_set)){//检测是否可写,可发送语句//标准输入memset(input_msg,0,sizeof(input_msg));fgets(input_msg, BUFFER_SIZE, stdin);char *find = strchr(input_msg, '\n');//查找换行符if(find) *find = '\0';//如果find不为空指针,就把一个空字符放在这里if (strcmp(input_msg, "\\quit") == 0){shutdown(server_sock_fd,SHUT_RDWR);return false;}if(input_msg[0]=='1' && input_msg[1]==' '){for (int i=1; i<=CONCURRENT_MAX; i++){//向每个连接的客户端发送信息if (client_fds[i]!=0){std::string s; s.clear(); s="0";//表明这是谁发过来的if(send(client_fds[i],s.c_str(),BUFFER_SIZE,0)==-1)perror("发送消息出错!");if(send(client_fds[i], input_msg, BUFFER_SIZE, 0)==-1)perror("发送消息出错!");}}}else if(input_msg[0]=='2' && input_msg[1]==' '){for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0){std::string s; s.clear();s="0";//表明这是谁发过来的if(send(client_fds[i],s.c_str(),BUFFER_SIZE,0)==-1)perror("转发消息出错!");}}for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0){if(send(client_fds[i],input_msg,BUFFER_SIZE,0)<0)perror("发送消息出错!");}}path.clear();for (int i=2; input_msg[i]!='\n' && input_msg[i]!='\0'; i++){path+=input_msg[i];}FILE *fp=fopen(path.c_str(),"rb+");char chtemp[BUFFER_SIZE+1];memset(chtemp,'\0',sizeof(chtemp));int cnt=0;if(fp==nullptr){printf("文件无法打开\n");}else {while((cnt=fread(chtemp,sizeof(char),BUFFER_SIZE,fp))>0){for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0){if(send(client_fds[i],chtemp,cnt,0)<0){perror("发送消息出错!");}}}memset(chtemp,'\0',sizeof(chtemp));}fclose(fp);printf("Transfer Successful!\n");}path.clear(); filename.clear();}else if(input_msg[0]=='3' && input_msg[1]==' '){printf("敬请期待!\n");}}return true;
}
bool Socket_server::sendIP(int index)
{std::string s1="0";send(client_fds[index],s1.c_str(),BUFFER_SIZE,0);s1.clear();s1="1 您现在是"+std::to_string(index)+"号客户机, 当前聊天室内成员如下:\n";send(client_fds[index],s1.c_str(),BUFFER_SIZE,0);for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0){s1.clear();s1="0";send(client_fds[index],s1.c_str(),BUFFER_SIZE,0);s1.clear();s1="1 "+std::to_string(i)+"号客户机,IP地址为:"+inet_ntoa(client_addr[i].sin_addr)+"\n";if(send(client_fds[index],s1.c_str(),BUFFER_SIZE,0)==-1) return false;}if(client_fds[i]!=0 && i!=index){s1.clear();s1="0";send(client_fds[i],s1.c_str(),BUFFER_SIZE,0);s1.clear();s1="1 新加入了"+std::to_string(index)+"号客户机,IP地址为:"+inet_ntoa(client_addr[index].sin_addr)+"\n";if(send(client_fds[i],s1.c_str(),BUFFER_SIZE,0)==-1) return false;}}return true;
}
void Socket_server::recv_word(int index,int byte_num)
{if(client_to[index]==0 || client_to[index]==-2){//发送给服务器的或者群发printf("客户端(%d):",index);for (int j=2; j<byte_num; j++){if(recv_msg[j]=='\0') break;printf("%c",recv_msg[j]);}printf("\n");}if(client_to[index]==-2){//群发其余客户端for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0 && i!=index){//先给id发送这是谁发过来的std::string s; s.clear();s=std::to_string(index);//表明这是谁发过来的if(send(client_fds[i],s.c_str(),BUFFER_SIZE,0)==-1)perror("转发消息出错!");if (send(client_fds[i], recv_msg, BUFFER_SIZE, 0) == -1){perror("转发消息出错!");}}}}else if(client_to[index]!=0){//发送给个人的//先给id发送这是谁发过来的std::string s; s.clear();s=std::to_string(index);//表明这是谁发过来的if(send(client_fds[client_to[index]],s.c_str(),BUFFER_SIZE,0)==-1)perror("转发消息出错!");if (send(client_fds[client_to[index]], recv_msg, BUFFER_SIZE, 0) == -1){perror("转发消息出错!");}}
}
void Socket_server::recv_file(int index,int byte_num)
{std::string tempfilename; tempfilename.clear();if(client_to[index]==0 || client_to[index]==-2){//发送给服务器的或者群发int pos=0;for (int j=byte_num-1; j>0; j--){if(recv_msg[j]=='/' || recv_msg[j]=='\\'){pos=j; break;}}for (int j=pos+1; j<byte_num; j++){if(recv_msg[j]=='\0') break;filename+=recv_msg[j];}//取得文件名称,准备建立新的文件printf("客户端(%d)向你传送了一个文件,请输入您想要存放的绝对路径,例如:/Users/longzhengtian/Desktop/\n注意,最后要有一个'/'符号,如果没有,系统将自动填充,请输入:",index);std::cin>>path; getchar();if(path[path.size()-1]!='/'){//如果没有'/'的补救措施path+="/";}//filename="new_"+filename;path+=filename;FILE *fp=fopen(path.c_str(),"wb+");if(fp==nullptr)printf("接收文件出错!\n");else {memset(recv_msg,0,sizeof(recv_msg));int cnt=0;while((cnt=recv(client_fds[index],recv_msg,BUFFER_SIZE,0)) && cnt>0){if(fwrite(recv_msg,sizeof(char),cnt,fp)<cnt){printf("接收文件出错!\n");break;}memset(recv_msg,0,sizeof(recv_msg));if(cnt!=BUFFER_SIZE) break;}printf("Receive successful!\n");fclose(fp);}if(client_to[index]==0) path.clear(); filename.clear();}if(client_to[index]==-2){//群发for (int i=1; i<=CONCURRENT_MAX; i++){if(client_fds[i]!=0 && i!=index){std::string s; s.clear();s=std::to_string(index);//表明这是谁发过来的if(send(client_fds[i],s.c_str(),BUFFER_SIZE,0)==-1)perror("转发消息出错!");}}filename="2 "+path;for (int i=1; i<=CONCURRENT_MAX; i++){if(i!=index && client_fds[i]!=0){if(send(client_fds[i],filename.c_str(),BUFFER_SIZE,0)<0)perror("发送消息出错!");}}FILE *fp=fopen(path.c_str(),"rb+");char chtemp[BUFFER_SIZE+1];memset(chtemp,'\0',sizeof(chtemp));int cnt=0;if(fp==nullptr){printf("文件无法打开\n");}else {while((cnt=fread(chtemp,sizeof(char),BUFFER_SIZE,fp))>0){for (int i=1; i<=CONCURRENT_MAX; i++){if(i!=index && client_fds[i]!=0){if(send(client_fds[i],chtemp,cnt,0)<0){perror("发送消息出错!");}}}memset(chtemp,'\0',sizeof(chtemp));}fclose(fp);printf("Transfer Successful!\n");}path.clear(); filename.clear();}else if(client_to[index]!=0){//发送给个人的std::string s; s.clear();s=std::to_string(index);//表明这是谁发过来的if(send(client_fds[client_to[index]],s.c_str(),BUFFER_SIZE,0)==-1)perror("转发文件出错!");if(send(client_fds[client_to[index]],recv_msg,BUFFER_SIZE,0)==-1)perror("转发文件出错!");memset(recv_msg,0,sizeof(recv_msg));int cnt=0;while((cnt=recv(client_fds[index],recv_msg,BUFFER_SIZE,0)) && cnt>0){if(send(client_fds[client_to[index]],recv_msg,cnt,0)==-1)perror("转发文件出错!");memset(recv_msg,0,sizeof(recv_msg));if(cnt!=BUFFER_SIZE) break;}printf("A file from Client%d to Client%d was successfully forwarded through this server\n",index,client_to[index]);}
}
void Socket_server::recv_video(int index)
{printf("敬请期待!\n");
}
void Socket_server::recv_and_forward()
{for (int i = 1; i <= CONCURRENT_MAX; i++){if (client_fds[i]!=0){if (FD_ISSET(client_fds[i], &server_fd_set)){//处理某个客户端过来的消息memset(recv_msg,0,sizeof(recv_msg));int byte_num = recv(client_fds[i],recv_msg,BUFFER_SIZE,0);if (byte_num > 0){if (byte_num > BUFFER_SIZE) byte_num = BUFFER_SIZE;recv_msg[byte_num] = '\0';if(strcmp(recv_msg,"\\exit")==0){//客户端要求解除连接client_to[i]=-1;}else if(client_to[i]==-1){//这条信息是对面发来指定发送对象的if(recv_msg[0]=='-') client_to[i]=-2;else client_to[i]=recv_msg[0]-'0';}else if(recv_msg[0]=='1'){//文字recv_word(i,byte_num);}else if(recv_msg[0]=='2'){//文件recv_file(i,byte_num);}else if(recv_msg[0]=='3'){//视频recv_video(i);}}else if(byte_num < 0)printf("从客户端(%d)接受消息出错.\n",i);else{FD_CLR(client_fds[i], &server_fd_set);//用于在文件描述符集合中删除一个文件描述符。client_fds[i] = 0;printf("客户端(%d)退出了\n",i);std::string s1;for (int j=1; j<=CONCURRENT_MAX; j++){if(client_fds[j]!=0 && i!=j){s1.clear();s1=std::to_string(i)+"号客户机退出了!\n";send(client_fds[j],s1.c_str(),BUFFER_SIZE,0);}}}}}}
}
void Socket_server::accept_new()
{if (FD_ISSET(server_sock_fd, &server_fd_set)){//检测server_sock_fd是否真的变成了可读,可接受语句//有新的连接请求struct sockaddr_in client_address;socklen_t address_len=sizeof(struct sockaddr_in);int client_socket_fd = accept(server_sock_fd, (struct sockaddr *)&client_address, &address_len);//对应客户端对connectif (client_socket_fd > 0){int index = -1;for (int i = 1; i <= CONCURRENT_MAX; i++){if (client_fds[i] == 0){index = i;client_fds[i] = client_socket_fd;break;}}if (index >= 0){printf("新客户端(%d)加入成功 %s:%d \n",index,inet_ntoa(client_address.sin_addr),ntohs(client_address.sin_port));//inet_ntoa:接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串client_addr[index]=client_address;sendIP(index);}else{memset(input_msg,0,sizeof(input_msg));strcpy(input_msg, "服务器加入的客户端数达到最大值!\n");send(client_socket_fd, input_msg, BUFFER_SIZE, 0);printf("客户端连接数达到最大值,新客户端加入失败 %s:%d \n",inet_ntoa(client_address.sin_addr),ntohs(client_address.sin_port));}}}
}
int main (){//本地地址Socket_server tcpserver;tcpserver.init(11111);//初始化,创建并绑定套接字,开始监听while (true){if(!tcpserver.start()) {//建立连接失败continue;}else{tcpserver.accept_new();//是否有新的加入if(!tcpserver.sendmessage()) exit(0);//发送信息,包含退出操作tcpserver.recv_and_forward();//接受信息。}}return 0;
}
客户端
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <queue>
#include <vector>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fstream>
const int BUFFER_SIZE=1024;
char recv_msg[BUFFER_SIZE];
char input_msg[BUFFER_SIZE];class Socket_client
{
public:Socket_client(){server_sock_fd=0;tv.tv_sec = 20;tv.tv_usec = 0;toID=-1;fromID=0;}~Socket_client(){}bool start();bool init();bool connect_s();bool sendmessage();void receive();void recvmessage();
private:int server_sock_fd;struct sockaddr_in server_addr;fd_set client_fd_set;struct timeval tv;int toID;//-1是初始化,-2是群发,0以上是私聊int fromID;std::string filename;std::string path;
};
bool Socket_client::init()
{server_addr.sin_len = sizeof(struct sockaddr_in);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(11111);server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");memset(&(server_addr.sin_zero),0,8);server_sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_sock_fd == -1){perror("socket error");return false;}return true;
}
bool Socket_client::connect_s()
{if(connect(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in))==0) {printf("服务器加入成功!\n");return true;}else return false;
}
bool Socket_client::start()
{FD_ZERO(&client_fd_set);FD_SET(STDIN_FILENO, &client_fd_set);FD_SET(server_sock_fd, &client_fd_set);int ret = select(server_sock_fd + 1, &client_fd_set, NULL, NULL, &tv);if (ret < 0 ){printf("select 出错!\n");return false;}else if(ret ==0){printf("timeout...\n");return false;}return true;
}
bool Socket_client::sendmessage()
{if (FD_ISSET(STDIN_FILENO, &client_fd_set)){if(toID==-1){//没有制定发送对象,0号表示服务器int a=-1,b=-1;scanf("%d",&a);if(a==1) {scanf("%d",&b); toID=b;}else toID=-2;std::string s=std::to_string(toID);if(send(server_sock_fd,s.c_str(),BUFFER_SIZE,0)==-1){perror("制定发送对象出错!");}getchar();}else {memset(input_msg,0,sizeof(input_msg));fgets(input_msg, BUFFER_SIZE, stdin);char *find = strchr(input_msg, '\n');//查找换行符if(find)//如果find不为空指针*find = '\0';//就把一个空字符放在这里if (strcmp(input_msg, "\\quit") == 0){shutdown(server_sock_fd,SHUT_RDWR);return false;}if (strcmp(input_msg, "\\exit") == 0){toID=-1;send(server_sock_fd,input_msg,5,0);return true;}if(input_msg[0]=='1'){//文字传送if (send(server_sock_fd, input_msg, BUFFER_SIZE, 0) == -1){perror("发送消息出错!");}}else if(input_msg[0]=='2'){//文件传输if (send(server_sock_fd, input_msg, BUFFER_SIZE, 0) == -1){perror("文件传输出错!");}std::string _path;for (int i=2; input_msg[i]!='\n' && input_msg[i]!='\0'; i++){_path+=input_msg[i];}FILE *fp=fopen(_path.c_str(),"rb+");char chtemp[BUFFER_SIZE+1];memset(chtemp,'\0',sizeof(chtemp));int cnt=0;if(fp==nullptr){printf("文件无法打开\n");}else {while((cnt=fread(chtemp,sizeof(char),BUFFER_SIZE,fp))>0){if(send(server_sock_fd,chtemp,cnt,0)<0){perror("发送消息出错!");}memset(chtemp,'\0',sizeof(chtemp));}fclose(fp);printf("Transfer Successful!\n");}}else if(input_msg[0]=='3'){//视频聊天printf("您选择了视频聊天,功能尚未完成\n");}else {printf("传输形式不合法,请重新输入。\n");}}}return true;
}
void Socket_client::recvmessage()
{fromID=0;//先接收到的是发送方ID;for (int i=0; recv_msg[i]!='\0'; i++){fromID*=10;fromID+=recv_msg[i]-'0';}memset(recv_msg,0,sizeof(recv_msg));memset(recv_msg,0,sizeof(recv_msg));int byte_num=recv(server_sock_fd,recv_msg,BUFFER_SIZE,0);if(byte_num>0){if (byte_num > BUFFER_SIZE) byte_num = BUFFER_SIZE;recv_msg[byte_num] = '\0';if(recv_msg[0]=='1' && recv_msg[1]==' '){//文字传输if(fromID==0) printf("服务器:");else printf("客户端(%d):",fromID);for (int j=2; j<byte_num; j++){if(recv_msg[j]=='\0' || recv_msg[j]=='\n') break;printf("%c",recv_msg[j]);}printf("\n");}else if(recv_msg[0]=='2' && recv_msg[1]==' '){int pos=0;for (int j=byte_num-1; j>0; j--){if(recv_msg[j]=='/' || recv_msg[j]=='\\'){pos=j; break;}}for (int j=pos+1; j<byte_num; j++){if(recv_msg[j]=='\0') break;filename+=recv_msg[j];}//取得文件名称,准备建立新的文件if(fromID==0) printf("服务器");else printf("客户端(%d)",fromID);printf("向你传送了一个文件,请输入您想要存放的绝对路径,例如:/Users/longzhengtian/Desktop/\n注意,最后要有一个'/'符号,如果没有,系统将自动填充,请输入:");std::cin>>path; getchar();if(path[path.size()-1]!='/'){//如果没有'/'的补救措施path+="/";}//filename="new_"+filename;path+=filename;FILE *fp=fopen(path.c_str(),"wb+");if(fp==nullptr)printf("接收文件出错!(R216)\n");else {memset(recv_msg,0,sizeof(recv_msg));int cnt=0;while((cnt=recv(server_sock_fd,recv_msg,BUFFER_SIZE,0)) && cnt>0){if(fwrite(recv_msg,sizeof(char),cnt,fp)<cnt){printf("接收文件出错!(R223)\n");break;}memset(recv_msg,0,sizeof(recv_msg));if(cnt!=BUFFER_SIZE) break;}printf("Receive successful!\n");fclose(fp);}path.clear(); filename.clear();}else if(recv_msg[0]=='3' && recv_msg[1]==' '){//视频传输尚未完成}}else if(byte_num < 0){printf("接受消息出错!\n");}else{printf("服务器端退出!\n");shutdown(server_sock_fd,SHUT_RDWR);exit(0);}
}
void Socket_client::receive()
{if (FD_ISSET(server_sock_fd, &client_fd_set)){memset(recv_msg,0,sizeof(recv_msg));long byte_num = recv(server_sock_fd,recv_msg,BUFFER_SIZE,0);if (byte_num > 0){if (byte_num > BUFFER_SIZE){byte_num = BUFFER_SIZE;}recv_msg[byte_num] = '\0';recvmessage();if(strcmp(recv_msg,"服务器加入的客户端数达到最大值!\n")==0){exit(0);}}else if(byte_num < 0){printf("接受消息出错!\n");}else{printf("服务器端退出!\n");shutdown(server_sock_fd,SHUT_RDWR);exit(0);}}
}
int main (){Socket_client tcpclient;tcpclient.init();if (tcpclient.connect_s()){while (true){if(!tcpclient.start()){continue;}else{if(!tcpclient.sendmessage()) exit(0);tcpclient.receive();}}}return 0;
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 计算机网络安全教程(第三版)第十一章简答题答案
第 11 章 IP安全与Web安全说明IP安全的必要性。 答: 大型网络系统内运行多种网络协议(TCP/IP、IPX/SPX和NETBEUA等),这些网络协议并非为安全通信设计。而其IP协议维系着整个TCP/IP协议的体系结构,除了数据链路层外,TCP/IP的所有协议的数据都是以IP数据报的形式传输的,目…...
2024/5/8 19:10:55 - 剑指offer-js 顺时针打印矩阵
顺时针打印矩阵 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.问题分析: 定义四个变量,表示左上和右下的打…...
2024/4/24 3:55:24 - eNSP模拟器中NE40E与AR通过Eth-Tunk对接由于hash算法不同导致业务不通问题记录
故障现象,查看两端eth-trunk状态正常,但会有eth-trunk IP/DOWN的记录,并且业务不通NE40E设备查看eth-trunk信息如下[~NE]display eth-trunk 10 Eth-Trunk10s state information is: Local: LAG ID: 10 WorkingMode: STATIC Preempt Delay: Disabled …...
2024/5/8 16:19:58 - Nvidia Jetson AGX Xivier 远程开发配置 软件源, ssh, pppoe
这篇文章的目的是记录 Nvidia Jetson AGX Xivier(下面简称 Jetson)开发板的配置过程. 主要是配置了开发板的 pppoe 网络, 软件源, ssh等. 通过本文的配置, 用户可以在个人电脑上通过 ssh 应用连接 Jetson 的终端. 其它运行 Linux 系统的设备(如服务器)也可已通过类似的工作实现…...
2024/5/5 12:04:40 - 深究强化学习在谷歌芯片布局上的应用
谷歌论文:Chip Placement with Deep Reinforcement Learning。目录电路板制作流程芯片制作流程芯片布局布局宏(macros)模型结构Graph Embedding预训练Policy Network学习过程布局标准单元(standard cells)总结电路板制作流程在讲解芯片布局之前,我们先了解电路板的大致制作流…...
2024/5/8 19:11:57 - 2.4构造函数语义(编译器什么时候会生成默认构造)笔记
一.什么是默认构造函数默认构造函数(缺省构造函数):没有参数的构造函数;二.编译器什么时候会为我们生成默认构造函数传统认识认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数,我们称这种构造函数为:“合成的默认构造函数”.…...
2024/4/24 9:35:03 - 42. Trapping Rain Water(数组积水)左右同时从低到高
题目: 给定n个代表海拔图的非负整数,其中每个条的宽度为1,计算下雨后它能捕获多少水。 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 思路: 从两边开始,最左和最右比较,从较小的那一方开始,因为这样的话从这边开始的每一步的计算的都可以能够把水积住(因为短板效应)。设…...
2024/5/7 21:43:13 - 【Linux命令】《鸟哥Linux基础》第八章 文件与文件系统的压缩
第八章 文件与文件系统的压缩 网站也可以利用文件压缩的技术来进行数据传送,好让网站带宽的可利用率上升。 8.1 压缩文件的用途与技术 1 将没有使用到的空间丢出来【0000 0001---->1】 2 将重复的数据进行统计记录【100个1】 8.2 Linux系统常见的压缩命令压缩文件扩展名 压…...
2024/5/3 2:27:59 - Spring Security 简单认证与授权
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC、DI和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代…...
2024/4/24 9:35:00 - 温故知新:基于R语言的群体药代动力学数据探索
基于R语言的群体药代动力学数据探索一 、群体药代动力学数据探索目的和方法数据探索目的数据来源方法二、数据探索过程PK数据探索加载的包和设目录读取数据和数据处理平均血药浓度计算和作图每个受试者血药浓度图PD数据探索平均药效指标图每个受试者药效指标图 一 、群体药代动…...
2024/4/18 23:38:49 - 使用python一句话中的字符长度大于5时此字符反序排列输出
给定一句话,若这句话中某一个字符串的长度大于5时,就将此字符串反向排序输出 def spin_words(sentence):# 将句子中单词转化为序列,以空格分隔s = sentence.split( )#根据序列的索引,设定循环,range(len(s))获取的为序列的索引for i in range(len(s)):#获取到对应索引的字…...
2024/4/23 10:13:01 - Xshell如何配置并远程连接Linux服务器详解
如何通过Xshell远程连接Linux服务器,以及如何配置xshell各项参数。说明:本文讲解通过xshell如何连接Linux服务器,不会讲解如何安装xshell。创建会话 创建会话目录 要求:一个项目则有一个会话目录,目录下对应着项目的所有会话。这样的规划更有利于后期会话的管理,免得所有…...
2024/5/5 16:41:21 - 线程8锁机制
1 标准访问,先打印短信还是邮件package com.dym.jvm;class Phone {public synchronized void sendSMS() throws Exception{System.out.println("------sendSMS");}public synchronized void sendEmail() throws Exception{System.out.println("------sendEmail…...
2024/4/30 22:30:55 - Hive表查看各个分区的更新时间
(作者:陈玓玏data-master.net) 查看hive各分区更新的时间: show create table dev.cdl_monitor;找到LOCATION,表示的就是hive表的数据存放的路径 (下面的图片,有些信息被我隐掉啦,不过不影响阅读) 找到路径后,在命令行输入以下命令 hdfs dfs -ls hdfs://nameservice1…...
2024/4/16 10:36:34 - Java中的代理(静态代理和动态代理)
一、代理的概念:定义:为其他对象提供一种代理,以控制对这个对象的访问。关于Java中的代理,有一种常用的设计模式---代理模式;对于代理,根据创建代理类的时间点的不同,又可以分为:静态代理和动态代理。代理模式,是一种常用的Java设计模式,其特征是代理类与委托类有同样…...
2024/4/16 10:37:25 - 软件测试人员如何提升自己?送给职场中迷茫的你【共勉】
很多人在进入软件测试行业几年之后,可能都会进入一个瓶颈期,不知道如何去提升自己,但自己能意识到这个问题就是好事。 我在前面的几年也曾遇到这个问题,走出舒适区确实很难,但如果可以走出来,就会实现自己最终的目标。 今天我们就来说说在进入到行业后,应该如何在职场中…...
2024/5/5 5:24:09 - Spring MVC之 文件上传 FileUpload
我是一名热爱java语言的 小白! 我是一名热爱java语言的 小白! 我是一名热爱java语言的 小白! 接下来我们来学习一下文件上传 首先导入依赖<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><…...
2024/5/3 21:39:07 - 认识ES6中的模块化-导入导出
模块化开发的必要性 比如一个项目由两个人开发,小明在文件aaa.js里边定义了一个很普通的参数var flag=true 小红在开发ccc.js是也定义了 flag 并且赋值为flase,在小明开发了aaa,bbb之后,等到开发mmm的时候,需要用到flag参数,小明并没有改过这个参数,于是他直接在mmm.js里…...
2024/4/20 0:28:09 - JMeter相关使用
今天学习下压力测试工具JMeter的使用,参照教学视频进行记录,仅供今后学习使用,欢迎指导! 提及压力测试,就忍不住想到性能测试、负载测试,关于这三者之间的关系,本人目前是这样粗略理解的(对,没错,就是粗略):首先,性能测试指的是通过自动化测试工具模拟多种正常、峰…...
2024/4/16 10:37:30 - 第1章 机器学习基础
机器学习 概述 机器学习(Machine Learning,ML) 是使用计算机来彰显数据背后的真实含义,它为了把无序的数据转换成有用的信息。是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的…...
2024/4/16 10:37:10
最新文章
- 巨资回流,量子投资热潮再起
一股新的信心和资金浪潮正在席卷量子计算产业。 2023年4月30日,澳大利亚联邦政府和昆士兰州政府宣布共同出资9.4亿澳元(约合6.2亿美元),支持美国初创企业PsiQuantum在布里斯班附近建设一台大型量子计算机。这项投资是最新的迹象之…...
2024/5/8 19:18:45 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 腾讯云云原生数据库TDSQL-C mysql 以及项目怎么接入
要接入腾讯云的云原生数据库TDSQL-C的MySQL版本,并将它用于你的项目中,你需要按照以下步骤进行: 创建TDSQL-C的MySQL数据库实例: 登录腾讯云控制台。在产品搜索框中搜索TDSQL-C,然后选择它。在TDSQL-C的产品页面上&…...
2024/5/4 6:23:44 - c++类的继承方式
在 C 中,类的继承方式有三种:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。这些继承方式决定了派生类对基类成员的访问权限。 …...
2024/5/3 14:42:38 - 多态--下
文章目录 概念多态如何实现的指向谁调谁?例子分析 含有虚函数类的大小是多少?虚函数地址虚表地址多继承的子类的大小怎么计算?练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…...
2024/5/7 8:32:32 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57