当前位置:网站首页>Implementation of POP3 client code
Implementation of POP3 client code
2022-07-24 02:21:00 【ZhuMou】
This is the course of this semester The big homework of Internet Application , Done by one alone . Specific resources can be downloaded for free on my homepage , I think so . I remember I set it as free .
Requirements are as follows :

More specifically, you should see my design report , You can't upload it here . Just looking at the following code is not very good to understand .
Just download it from the resources , Free of charge . It's not free to kick me , I'll change it . Yes bug Kick me .
Please pay attention to copying code : Some of my notes are in Chinese , Be careful not to pass the compiler . Then I C The language is C99 Of , Environment is wubantu .
1 makefile be used for Linux compile
main.exe:main.out tcp.out logon.out choose.out stat.out list.out retr.out encode.out readLine.out dele.out search.out
gcc main.out tcp.out logon.out choose.out stat.out list.out retr.out encode.out readLine.out dele.out search.out -o main.exe
main.out:main.c
gcc -c main.c -o main.out
tcp.out:tcp.c
gcc -c tcp.c -o tcp.out
logon.out:logon.c
gcc -c logon.c -o logon.out
choose.out:choose.c
gcc -c choose.c -o choose.out
stat.out:stat.c
gcc -c stat.c -o stat.out
list.out:list.c
gcc -c list.c -o list.out
retr.out:retr.c
gcc -c retr.c -o retr.out
encode.out:encode.c
gcc -c encode.c -o encode.out
readLine.out:readLine.c
gcc -c readLine.c -o readLine.out
dele.out:dele.c
gcc -c dele.c -o dele.out
search.out:search.c
gcc -c search.c -o search.out
2 choose() POP3 Client function selection
#ifndef _CHOOSE_H_
#define _CHOOSE_H_
int choose();
#endif
#include <unistd.h>
#include <stdio.h>
#include "choose.h"
int choose(){
int choice = 0;
puts("-----Here is the main menu!-----");
puts("UA offers these functions for you:");
puts("1.check the state of the mailbox");
puts("2.list all the mails in the mailbox");
puts("3.display the content of a mail");
puts("4.delete a main from the mailbox");
puts("5.keyword search in local mails");
puts("6.display the subjects of local mails");
puts("7.quit anyway");
puts("------End of the main menu------");
int rec = 0;
char buf[BUFSIZ];
do{
puts("Your choice: ");
while(rec == 0){
rec = read(STDIN_FILENO,buf,sizeof(buf));
}
if(rec > 2){
puts("Error: too long input!");
rec = 0;
continue;
}
if(buf[0] < '1' || buf[0] > '7'){
rec = 0;
puts("Error: beyond 1-7!");
continue;
}
break;
}while(1 == 1);
choice = buf[0] - '0';
return choice;
}
3 dele() Delete mail
#ifndef _DELE_H_
#define _DELE_H_
void dele(int cfd);
#endif
#include "dele.h"
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void dele(int cfd){
int rec = 0;
char dele[20] = {'D','E','L','E',' ','\0'};
puts("----DELE----");
char buf[BUFSIZ];
// Give users a whole inquiry function , So as not to delete by mistake
char num[10];// Used to store the serial number to be deleted
char a;
int i = 0;
while((a = getchar())!='\n'){
num[i] = a;
++i;
}
num[i] = '\n'; num[i+1] = '\0';
strcat(dele,num);
// Here is a confirmation
puts("Are you SURE you want DELETE an email?");
printf("You command: %s",dele);
puts("Enter y/Y to confirm and others to CANCEL!");
printf("You FINAL choice:");
a = getchar();
char b;//b It is used to empty the buffer
while((b=getchar())!='\n'){
}
if(a=='y' || a=='Y'){
;//do nothing
}else return;
write(cfd,dele,strlen(dele));
readLine(cfd,buf,sizeof(buf));
if(buf[0]=='-' && buf[1]=='E' && buf[2]=='R'){
system("clear");
puts("From MTA: invalid command!");
puts("From MTA: or you may not have so many mails!");
return;
}
puts("You have delete one mail!");
}
4 encode() be used for base64 decode , It was originally named decode Of , The name was wrong , Has been used
#ifndef _ENCODE_H_
#define _ENCODE_H_
void encode(char* buf,char*);
#endif
#include "encode.h"
#include <stdio.h>
//encode for very four BASE64 codes
void toBinary(int num,int* binary){
int i = 0;
int j = 0;
if(num == -1){// Deal with what the equal sign brings -1 The situation of , At this time, we need all -1
for(j=0;j<6;++j){
binary[j] = 0;
}
return;
}
while(num !=0){
binary[i] = num%2;
++i;
num = num / 2;
}
return;
}
void encode(char* password,char* result){
//password It's known to be four , such as dasf\0, Split and remove \n The function of needs to be solved externally
//result Three digits ascii character , For the result of decoding . If dad\0
const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int bit0[6] = {0};//password[0] The binary representation of
int bit1[6] = {0};//password[1] The binary representation of
int bit2[6] = {0};//password[2] The binary representation of
int bit3[6] = {0};//password[3] The binary representation of
int count = 0;//= The number of
int bit[25];
// hold base64 The code text becomes based on table The number of represents , Store in num in
int num[4];
int i = 0; int j = 0;int k = 0;
for(i=0;i<4;++i){
for(j=0;j<64;++j){
if(password[i]==table[j]){// For every one password The codeword of is found in table Position in
// Record location
num[i] = j;
break;// Saving time
}
if(password[i]=='='){
num[i] = -1;// about =, We turn it into -1 To differentiate
}
}
}
//test for password to num Three inputs :addd ad== add=
/*printf("%c = %d\n",password[0],num[0]);
printf("%c = %d\n",password[1],num[1]);
printf("%c = %d\n",password[2],num[2]);
printf("%c = %d\n",password[3],num[3]);
*/
// hold num The number in becomes the corresponding binary form , Put in bit0,1,2,3 in
toBinary(num[0],bit0);
toBinary(num[1],bit1);
toBinary(num[2],bit2);
toBinary(num[3],bit3);
//test for the all above codes Three inputs :addd ad== add=
/* for(int i =0;i<6;++i){
printf("%d\n",bit0[i]);
}
for(int i =0;i<6;++i){
printf("%d\n",bit1[i]);
}
for(int i =0;i<6;++i){
printf("%d\n",bit2[i]);
}
for(int i =0;i<6;++i){
printf("%d\n",bit3[i]);
}*/
// At this time, we need to find out how many = In order to determine how much to subtract at the end 0. Subtract from each equal sign 8 individual 0.
for(k=0;k<4;++k){
if(num[k]==-1) ++count;
}
//test for count = Three inputs :addd ad== add=
/* printf("count = %d\n",count);*/
int charnum = 3 - count;// Calculate what can be converted ascii The number of characters
int pow2[6] = {1,2,4,8,16,32};
int ascii0 = 0;
int ascii1 = 0;
int ascii2 = 0;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
//ascii0 Need that bit0 All and bit1 Two high positions of , Don't forget to deal with it
for(k=0;k<6;++k){
ascii0 = ascii0 + bit0[k] * pow2[k];
}
ascii0 = ascii0 * 4;
for(k=4;k<6;++k){
temp1 = temp1 + bit1[k] * pow2[k];
}
temp1 = temp1/16;
ascii0 += temp1;
// printf("ascii0 = %d\n",ascii0);
//ascii1 need bit1 And bit2 Four high positions of
if(charnum >= 2){
for(k=0;k<4;k++){
ascii1 = ascii1 + bit1[k]*pow2[k];
}
ascii1 = 16 * ascii1;
for(k=2;k<6;++k){
temp2 = temp2 + bit2[k]*pow2[k];
}
temp2 = temp2/4;
ascii1 += temp2;
// printf("ascii1 = %d\n",ascii1);
}
//ascii need bit2 And bit3 All
if(charnum >= 3){
for(k=0;k<2;k++){
ascii2 = ascii2 + bit2[k]*pow2[k];
}
ascii2 = 64 * ascii2;
for(k=0;k<6;++k){
temp3 = temp3 + bit3[k]*pow2[k];
}
ascii2 = ascii2 + temp3;
// printf("ascii2 = %d\n",ascii2);
}
if(charnum==1){
result[0] = ascii0;
result[1] = '\0';
}
if(charnum==2){
result[0] = ascii0;
result[1] = ascii1;
result[2] = '\0';
}
if(charnum==3){
result[0] = ascii0;
result[1] = ascii1;
result[2] = ascii2;
result[3] = '\0';
}
return;
}
5 list() Used to view mailbox status
#ifndef _LIST_H_
#define _LIST_H_
void list();
#endif
#include <stdio.h>
#include "list.h"
#include <unistd.h>
void list(int cfd){
int rec = 0;
puts("----LIST----");
char buf[BUFSIZ];
write(cfd,"LIST\n",5);
while(1){
rec = readLine(cfd,buf,sizeof(buf));
if(buf[0]=='.' && buf[1]==13 && buf[2]==10){
puts("From UA: end of list");
break;
}
printf("From MTA: %s",buf);
}
}
6 logon() For user login
#ifndef _LOGON_H_
#define _LOGON_H_
int logon(int cfd);
#endif
#include <stdio.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "logon.h"
int logon(int cfd){
int rec1 = 0;
int rec2 = 0;
int returnValue = 0;
char buf1[BUFSIZ];
char buf2[BUFSIZ];
char buf3[BUFSIZ];
char buf4[BUFSIZ];
char buf5[BUFSIZ];
char pass[] = "PASS "; char* commands;
char user[] = "USER "; char* command;
char a,b;
puts("------LOG IN------");
puts("Your username: ");
//ask for use
int i = 0;
while((a = getchar()) != '\n'){
buf2[i] = a;
++i;
}
buf2[i] = '\n'; buf2[i+1] = '\0';
command = strcat(user,buf2);
printf("YOUR COMMAND = %s",command);
write(cfd,command,strlen(command));
rec1 = read(cfd,buf3,sizeof(buf3));
printf("From MTA: %s",buf3);
//ask for password
puts("Your password: ");
//ask for pass
int j = 0;
while((b = getchar())!='\n'){
buf4[j] = b;
++j;
}
buf4[j] = '\n'; buf4[j+1] = '\0';
commands = strcat(pass,buf4);
printf("YOUR COMMANDS = %s",commands);
write(cfd,commands,strlen(commands));
rec1 = read(cfd,buf5,sizeof(buf5));
printf("From MTA: %s",buf5);
// If it is +OK Words , It indicates that the login is successful ; Otherwise failure
if(buf5[0]=='+'&&buf5[1]=='O'){
returnValue = 1;
}else returnValue = -1;
return returnValue;
}
7 main() The main function
#include "tcp.h"
#include "logon.h"
#include <stdio.h>
#include <stdlib.h>
#include "choose.h"
#include "stat.h"
#include "list.h"
#include "retr.h"
#include "encode.h"
#include "readLine.h"
#include "dele.h"
#include "search.h"
#include "main.h"
#define SER_PORT 110
int main(){
// First try to establish tcp Connect
system("clear");
const char ser_ip[] = "123.126.96.209";
int cfd = tcp(SER_PORT,ser_ip);
int result = 0;
system("clear");
while((result = logon(cfd)) == -1){
puts("------please try again------\n");
}
system("clear");
// As long as the connection and login succeed, it doesn't matter
int flag = 0;
int i = 0;
char a;
char buf[BUFSIZ];
char keyword[20];
do{
// system("clear");
int choice = choose();
printf("Your choice is %d\n",choice);
switch(choice){
case 1: stat(cfd); break;
case 2: list(cfd); break;
case 3: retr(cfd); break;
case 4: dele(cfd); break;
case 6: search(buf,"./EMAIL/",1); break;
case 5:
puts("Enter the keyword you want to search:");
while((a=getchar())!='\n'){
keyword[i] = a;
++i;
}
keyword[i] = '\0';
search(keyword,"./EMAIL/",2);
i = 0;
break;
case 7: close(cfd);puts("-----Good bye-----");exit(0); break;
}
}while(1);
return 0;
}
8 readLine() Used to read a row from the specified socket ( With \n ending )
#ifndef _READLINE_H_
#define _READLINE_H_
int readLine(int fd,char* buf,int size);
#endif
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "readLine.h"
int readLine(int fd,char* buf,int size){
char buf1[10];
int rec = 0;
int i = 0;
while((rec = read(fd,buf1,1)) > 0){
*(buf + i) = buf1[0];
i++;
if(buf1[0] == '\n') break;// Handle blocking
}
*(buf + i) = '\0';// Finally, add \n
return strlen(buf);
}
9 retr() Used to view the specific contents of the mailbox , And you can choose whether to download the email locally ( Ubantu system )
#ifndef _RETR_H_
#define _RETR_H_
void retr(int cfd);
#endif
#include <stdio.h>
#include "retr.h"
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include "encode.h"
#include "readLine.h"
int judge(char* buf,int size);
void retr(int cfd){
int rec = 0;
char buf1[10];// Used to form commands
char buf[BUFSIZ];
char retu[] = "RETR ";// Used to form commands
char a;// Used to read keyboard buffer
char* buf2;// Later, it is used to read the mail content
// Clean buffer , The keyboard buffer is empty
puts("----RETR----");
puts("Enter the sequence ID: ");
int i = 0;
while((a = getchar()) != '\n'){
buf1[i] = a;
++i;
// Until you read something from the keyboard
}
buf1[i] = '\n'; buf1[i+1] = '\0';
strcat(retu,buf1);
write(cfd,retu,strlen(retu));
/* char buf_en[] = "QQ==";
char result[3];
encode(buf_en,result);
printf("result of encode = %s\n",result);*/
printf("Your command is %s",retu);
// Print the content , The key is how to read the contents of the buffer , Especially if the number of mail bytes is too large
// When the printing is finished, the whole fault-tolerant
// Use read(cfd,buf,1); It can read a single character . We read one line at a time , Until I read .\n
int j = 0;
int k = 0;
int length = 0;
int flag = -1;// Whether the previous item meets the conditions
char buf_4[] = "1234";
char buf_en[] = "123";
int html_plain = 0;
FILE* file;
file = fopen("./EMAIL/copyused","w");// Must be in override mode !
while(1){
++j;
readLine(cfd,buf,BUFSIZ);
// Fault tolerance
if(j == 1){
if(buf[0] == '-' && buf[1] == 'E'&& buf[2] == 'R'){
system("clear");
puts("From MTA: invalid command!");
puts("From MTA: or you may not have so many mails!");
fclose(file);
return;
}
}
// Handle blocking , Avoid blocking and affecting the user experience
if(buf[0] == '.' && buf[1] == '\r' && buf[2] == '\n'){
printf("\n%s",buf);
fprintf(file,"\n%s",buf);
break;
}
// Keep what users need header
if(judge(buf,BUFSIZ) == 1){
printf("\r%s",buf);
fprintf(file,"\r%s",buf);
continue;
}
if(judge(buf,BUFSIZ) == 0){
flag = -1*flag;
continue;
}
if(judge(buf,BUFSIZ) == 4){
++html_plain;
}
if(flag == 1 && judge(buf,BUFSIZ)!=2 && html_plain%2==0){// Here is the text , need encodei
// Need to put buff Constantly split into 4 A group of characters
// Because every line is 4 Multiple , So there is no need to remember
length = strlen(buf) - 2;//buf remove \n\r Number of outer characters
for(k=0;;++k){
if(4*k >= length) break;
buf_4[0] = buf[4*k]; buf_4[1] = buf[4*k+1];
buf_4[2] = buf[4*k+2]; buf_4[3] = buf[4*k+3]; buf_4[4] = '\0';
encode(buf_4,buf_en);
//oneline That's ok buf whole strcat(buf,oneline) decode(buf)
//readLine(socket,oneline)
buf_en[3] = '\0';
printf("%s",buf_en);
fprintf(file,"%s",buf_en);
}
continue;
}
}
fclose(file);
puts("\nFrom UA: Mail End");
puts("Do you want to save this mail in your PC?");
puts("Y/y for yes");
char linuxcommand[300] = "cp ./EMAIL/copyused ";
char filename[255] = "./EMAIL/";
char suffix[] = ".eml";
char q;char p;int r = 8;
p = getchar();// I only look at the first character as long as the first character is y/Y that will do
while((q=getchar())!='\n'){
// Empty buffer
}
if(p =='y' || p == 'Y'){
puts("Your email named as:");
while((q=getchar())!='\n'){
filename[r] = q;
++r;
}
filename[r] = '\0';
strcat(filename,suffix);
strcat(linuxcommand,filename);
}
return;
}
// Determine whether you need to type this string , We just need the email itself , Others don't need
//1 representative header part ,-1 Represent other control information that users definitely don't want to see ,0 representative blank line( Carriage return and line feed ),2 The representative begins with This Of
int judge(char* buf,int size){
int type = -1;
//from part
if(buf[0]=='F'&&buf[1]=='r'&&buf[2]=='o'&&buf[3]=='m')
type = 1;
if(buf[0]=='T'&&buf[1]=='o'&&buf[2]==':')
type = 1;
if(buf[0]=='S'&&buf[1]=='u'&&buf[2]=='b'&buf[3]=='j'&&buf[4]=='e'&&buf[5]=='c'&&buf[6]=='t')
type = 1;
if(buf[0]=='D'&&buf[1]=='a'&&buf[2]=='t'&&buf[3]=='e')
type = 1;
if(buf[0]=='C'&&buf[1]=='c')
type = 1;
if(buf[0]=='T'&&buf[1]=='h'&&buf[2]=='i'&&buf[3]=='s')
type = 2;
// How to judge the blank line is a problem
// hypothesis header And content Between the blank line Only line breaks \n
if(buf[0] == 13 && buf[1]==10)//
type = 0;
if(buf[0] == '-' && buf[1]=='-')
type = 3;
if(buf[0]=='C'&&buf[1]=='o'&&buf[2]=='n'&buf[3]=='t'&&buf[4]=='e'&&buf[5]=='n'&&buf[6]=='t'&&buf[7]=='-'&&buf[8]=='T'&&buf[9]=='y')
type = 4;
return type;
}
10 search() Search the subject or keyword of local mail
#ifndef _SEARCH_H_
#define _SEARCH_H_
void search(char* keyword,char* directory,int type);
#endif
#include <dirent.h>
#include <stdio.h>
#include <string.h>
void search(char* keyword,char* directory,int type){//type = 1 Indicates topic retrieval ,type = 2 Indicates keyword search
// Need to dynamically maintain a emltable
char* emltable[100];// Too lazy to engage in dynamic allocation , Just static allocation
char* temp;// For temporary storage of file names
DIR* dirptr = NULL;// Pointer to folder
struct dirent *entry;// Information about storing documents
if((dirptr = opendir(directory))==NULL){
puts("From UA: fail to open Directory MAIL!");
return;
}
int num = 0;// Storage file The number of
int length = 0;// Temporary storage string length
while((entry=readdir(dirptr))){
// printf("%s",entry->d_name);// Including the current directory and the upper level directory
// as long as endwith .eml The file of , Unwanted copyused,. and ..
temp = entry->d_name;
length = strlen(temp);
if(temp[length-1]=='l'&&temp[length-2]=='m'&&temp[length-3]=='e'&&temp[length-4]=='.'){
emltable[num] = temp;
++num;
}
}
// The above code successfully put the file names of all the files in the folder emltable In this watch ,num Express eml Number of documents
FILE* file;// Here is the emltable It's OK to complete all the elements in
int i = 0;int j =0;int k = 0;
//type = 1 Topic retrieval
char filename[100];
strcpy(filename,directory);
char oneline[1000] = "123";
int length2 = 0;
int num_k = 0;
int length_k = strlen(keyword);
for(i=0;i<num;++i){
file = fopen(strcat(filename,emltable[i]),"r");
// Here is the retrieval operation
// Topics can be retrieved line by line
if(type == 1){
while(1){
freadLine(file,oneline,BUFSIZ);
if(oneline[0]=='.' && oneline[1]=='\r' & oneline[2] == '\n'){
break;
}
if(type == 1){
if(oneline[0]=='\r' && oneline[1] == 'S' && oneline[2] == 'u'){
printf("From %s:\n",emltable[i]);
printf("%s",oneline);
}
}
}
}
if(type == 2){
while(1){
freadLine(file,oneline,BUFSIZ);
if(oneline[0]=='.' && oneline[1]=='\r' && oneline[2] == '\n')
break;
// How to search keywords in a row
for(j=0;j<strlen(oneline);++j){
if(keyword[0]==oneline[j]){
for(k=0;k<strlen(keyword);++k){
if(k+j > strlen(oneline)-1) break;
if(keyword[k]==oneline[k+j]){
;
} else break;
}//end of k for
// if(k==strlen(keyword)-1) puts("FOUND");
if(k==strlen(keyword)){
++num_k;
// printf("%s has %s\n",emltable[i],keyword);
}
}//end of outer if
}
}
}
if(num_k > 0)
printf("%s has %d %s\n",emltable[i],num_k,keyword);
// printf("%s",oneline);
num_k = 0;
fclose(file);
strcpy(filename,directory);
}
return;
}
// Need one freadLine function
int freadLine(FILE* file,char* buf,int size){
char a = 0;
int i = 0;
while((a = fgetc(file)) > 0){
*(buf + i) = a;
++i;
if(a == '\n') break;
}
*(buf + i) = '\0';
return strlen(buf);
}
11 stat() Used to view mailbox status
#ifndef _STAT_H_
#define _STAT_H_
void stat(int cfd);
#endif
#include <stdio.h>
#include "stat.h"
#include <unistd.h>
void stat(int cfd){
int rec = 0;
puts("----STAT----");
char buf[BUFSIZ];
write(cfd,"STAT\n",5);
rec = readLine(cfd,buf,sizeof(buf));
printf("From MTA: %s",buf);
puts("From UA: end of stat");
}
12 For building tcp Connect
#ifndef _TCP_H_
#define _TCP_H_
int tcp(short port,const char* ip);
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include "tcp.h"
#include <stdlib.h>
#include <string.h>
int tcp(short port, const char* ip){
int cfd = socket(AF_INET,SOCK_STREAM,0);// Socket for client
struct sockaddr_in serv_addr; // Socket address used to store the server
char serv_ip_addr[1024];
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
inet_pton(AF_INET,ip,(void*)&(serv_addr.sin_addr.s_addr));
if(cfd == -1){
printf("Socket created failed!");
exit(-1);
return -1;
}
if((connect(cfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))) == -1){
printf("TCP connection failed!");
exit(-1);
return -1;
}
// Now that the connection is successful , Then type the socket address on the server side
printf("The IP address of the server is %s.\n",inet_ntop(AF_INET,&serv_addr.sin_addr.s_addr,serv_ip_addr,sizeof(serv_ip_addr)));
printf("The port of the server is %d.\n",ntohs(serv_addr.sin_port));
char buf[BUFSIZ];
read(cfd,buf,sizeof(buf));
// because server talk first, So first deal with the cache , Empty it , Avoid affecting the next operation
/* printf("From MTA: %s\n",buf1);
puts("-------------------------------");*/
// Do an experiment here , Look at using read and write Reading and writing socket Is it feasible
// It must be used in this way strcat, Each use
/* char user0[] = "USER "; char user1[] = "wrong ycz18257687229\n"; char* user2 = strcat(user0,user1);
printf("%d\n",strlen(user2));
write(cfd,user2,strlen(user2));
rec1 = read(cfd,buf1,BUFSIZ);
printf("From MTA: %s\n",buf1);
puts("---------------------------------");
char pass0[] = "PASS "; char pass1[] = "wrongCLTWZWKNGARUDDSR\n"; char* pass2 = strcat(pass0,pass1);
write(cfd,pass2,strlen(pass2));
rec1 = read(cfd,buf1,BUFSIZ);
printf("From MTA: %s\n",buf1);
close(cfd);*/
return cfd;
}
边栏推荐
- 关于 SAP Fiori 应用的离线使用
- Opensmile introduction and problems encountered during installation
- Ggplot2 displays png
- Sharing a case of controller restart caused by a CIFS bug in NetApp Fas series
- 分布式资源管理与任务调度框架Yarn
- Redraw the button and make your own circular LED indicator
- About rapidssl certificate
- Brief introduction of tfw6524 perfectly replacing imported pt6524 chip
- What is restful
- Idea's gradle project Chinese garbled
猜你喜欢

async await详解 & Promise

Small volume stock trading record | based on multi task crawler technology, realize level1 sampling of A-share real-time market

认识传输层协议—TCP/UDP

网络协议详解:TCP Part1

【数据集】——flyingthings3d光流部分数据集下载

Preliminary use of 145 keep alive

Improvement of DB file sequential read caused by insert
In depth understanding of the underlying framework of wechat applet (II) component system, exprser

小散量化炒股记|基于多任务爬虫技术, 实现A股实时行情Level1采样

The combination sum of C language power deduction question 39. Backtracking method and traversal method
随机推荐
STM32概念和安装【第一天】
Brief introduction of tfw6524 perfectly replacing imported pt6524 chip
ASP. Net core write a cache attribute tool
Cmake Getting Started tutorial
LeetCode 70爬楼梯、199二叉树的右视图、232用栈实现队列、143重排链表
关于缺少编程基础的朋友想转行 ABAP 开发岗提出的一些咨询问题和解答
Redis 6.0 source code learning simple dynamic string
WordPress website SEO complete tutorial
View Binding 混淆问题。我两天都在研究混淆。
解决script标签写在元素节点前面无法获取元素节点的问题
深入理解微信小程序的底层框架(二)组件系统、Exparser
Today's code farmer girl learned about the express framework under node
Async await details & Promise
The new red envelope cover platform can build the source code of the independent background of the sub station
What's new in the ranking list in July? This language is invincible?
On the possibility and limitation of defi in the metauniverse
Try to run this command from the system terminal Make sure that you use the correct
Share two interesting special effects
Wallys/PD-60 802.3AT Input Output802.3AT/AT 85% Efficiency 10/100/1000M GE Surge Protection
[C language] preprocessing details