From 667af72a0abc7f2522310f88ecb5ef7528835011 Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 16 Feb 2021 16:27:22 +0800 Subject: [PATCH] add list cmd --- server | Bin 24296 -> 25904 bytes server.c | 82 +++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/server b/server index eb5cd1e31462a38e138d44c9ae974a9792a8fbb2..a19e418fdc67e5b7427e9ab73f630129a142ca36 100644 GIT binary patch literal 25904 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 literal 24296 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

r5m~G} z?w8O0nB{`JIxuE`!g5jG8jM8t1(xl+yP-LIh~+E&v!OFvxJZ=wzk%Oumn4?>H&c^a z5*7X<6d5Clpr0?uWP2r1>u+ZxS(4b~zn|JH*F(T=^G~F_v*?smx*GXhQ7VcYN&$zLC`Z%GArhOy#YLttzA7p>?s>%Bhiz4p;m3)gmxAOjl z<%ikv0vzETz_KjrkjDdiAP1Rf3kZqwP?M-%OxzCENx!F#+vkUW32MV(ffmg6#g+Fi>a#r^>ufTLDbva6o5Vr&6d2BOa^`o#l59_f0T+7!7AWvGEiU~x0ara! zIm-;q6jMGz?i%j_l%@XwGDbyDs?@#9T$P!llOV>kyFRcR{$R&o#9Q$ds{UoX$#EQfot#5HnV@ z{z-c4XOkp?)>ZC0P=bq?nFUD(_r6MqdzNUY zi5bt+EqjPo>T5yym`Msf1fk0zw1)-vzGlQY8E0I^+S^&I(R;o>K$*#P;AJgyyOEjk zoCkO_xzCK3OhP^gliaf~_pya$#l6XP6)KizRVGTdqPCTT3qc|9~h$O zI`BHUXUeFm;4ubY&CKOUS8!6oP>LBm)wt$UdYP8K6J;jXfh%y`Gjkl(&wmR5;-t8N z>aUBwZ`&_YGEiYo>wWs@`)M!hIAxem;fA!PHE$as@lZKZXS(psFNb(YbJgUnUp z^XGVc(|qGyg<}g4o9;=%<6D+Qa*e%QFtf(E zJicpkh*91JDEmq%n-1P_vVg-VM;6exTtB#Tatvo)Ub5LG;P<&)tNqlFUku%)Knf%IE@q?8tle7$2l+5H}xUvYSrTV^nin|EM zzf(1VsnQ&nKTVqNHRex8lUkBZUNUUo5-`sQxRy^*UcF+wJGR*q{UM(5IiFq)ED@I-xBf137^;T};7W;SCc$t#BCQtW~&Ztx%! z#E%)Eu8(|q_?2%2lP+zG#7pZ-H)1PGtTfh9*V$6KHWFSLZP^wsjcugz`; zS#0#DYKnxhy9C=}{<3;nP#W*-2&dYCdl$K9Cs5B5qO1=zbHX=8cna^OHG~@hV**g` z$|)9>>lzxOnu<5zMq^F_KM{qrFh_u(LoMwJTD7{S8YLVmP%1$L19~39#vATOQCx`# ziVY~E5}SV7JK~}G_GnmDDhooiPXRa(-DcYG%ye1)L}H&+e9)R;?Gx@Xo~!_VUEjoy z+kI(a))`V+jaj>oZ98^z*`Y)tjmP?C8q0gunPb~5KjoDw>&`68fAHqAV^WjVnDrM5 z3G1e^W9Lc_TE*@XztwcmbG!9TPquru>!9UdceYxK~+i#UwXUAx-PV4?V1%eCk}uK9=;QQ);6WJ1;5-p4Ll|Q7 zAkC$V1a`nFkyzcfunLdZ0=y5~D(5JSRV$j+gMmS5Yj5DowhiqG73Dg{piQc5tZQp& z?G%`^>Y@n3P=di9Wh`;?8yt=rz6#6;P&RTj)iywF4{F#Xc+Du*MLLsRgwAkeTMJ@b zd1+-;Rjq89`b7+H1S<<1vnq_1Zk4eleJH0-k&Jd}qC6CB26b#64^R=>7Uw&_CZuSw z?kxHqQmxlkR$W)UfrcvM(L4MXJTnRedQ-fa@ryP=FoNY#K6ep{+>EKl&V>IG`bG{^ zB)o&Xh~-5KC{>?`V!&GyZH^;H9>=sv4x2nAIG5PTPO&GUP)A+ET$N$$NX=K-0+lTs z_81#VL=v%Z!#s{J4Z#p@Q~j)}SzEoSx=Nn^WYow5Z{@Y?aNL>mAmU1n5|6h;hl(U< zsAm&$>#3AkS9zmYxw>k@ikj<`>h;y1(_U1El5(Vcb$d8SRBsVY>{TSuCij8j9r9SB zH7@>)%T}fwy$qSB^C>!?rt_sbSKR;kU%rvO1lI)ViEnh9?|eAxJi;U5qwhQq~ck^JU2+i#|pEao{C$-tiz|`*`gQM66wh!#tHLWz**-JImzcEsd%pFzy)x6 z@?iC_Vw81gkMJeGE8~>$hJ8 z&Pop!XN0-oc2syA-&t_Luyd47fx#op(fmt2f$nFli9RT=P2!0i+bir{=_j}rfJ@bfz(W-(B&zldELH>-Mjsuq)= zhx}$i(u~V)@Q-Hy-(|r0c!GYY(G5PPZGIeh0qmTRcAP$?`O{a_xV~99%Dlu!52M-h zN(Q_W{ThwGF9ZL_8Ss4VAG0=V{4+)B_l;OBvoo|iKLfrFIQ^48kA;A9T+GU>&_TfU ztI_(kBLm(8T#M=vQ5jd_$GayB^Ze0NekX&Tr^ydX&3VE2;eSeg--yLGuEa7PPGbdx zDXcQlmqGu>8Su%t@gJ?f&q7}T{Ig@7tu?Fc(~=)?h*cjZvw*ru+he}3_Gwiu7G==? z*$nt*;Nvk~W(D5(p;_V>uUcDaMte+rQb;?~ z^H{{pV=IB%PKW6-pIwY*&*y>98ioJ6avm6Y-PI%Y_(m+|^F2=5V{1E&J$zSmw057? zdeWD=MSV0Li{sWED`3OlKnlg%LiqGj1gmACP(ypDskMDeU2CWT>kGIeP3#bOR}1fG z;YF^%;zdiBjLyVwGqr^3qS3le+_GUk0N-?~YYT@O5^Zg`p9?uCc}tqYI(%ClSTJuP zZ(3I2UZXlxy=G+yiy5f`xSd>i)0)cbS68LhU}*&RgrN|YR6^B3ts%H_od{i9vvx&g zO=#_^RqLxagf>*Jz`ZjV<+r2iV+m=x{6tknh53FIKNY1vaFq(`FJYyEf9a!A&ifoZ z_~I9|QibKWuTmj%+a3zbTPf#?jQm(v8aM6-QxWwou2c*o91EvH>Ww+B-{=Jv`LV84 zo)MqeO0TAc>XTV&QAmB7E0s%s(km5A|JqilA=Vyhu8TC_OI+$xVZ;3Rh?l(k<+5vt zcde<5B#yC^%N^?LX2at0!(XYNG#jp5taS||WOuCFsh9mytL4YdQX$8Rms}ADg|@_E z+B5P7m&<3VBJ!JSsgU{rTPh~Mn3f8up-aV_>ne_=I>o9N!}!6sR4Kjwp+3ZxS``Z6 z^Jw}YOx}jeSReJPX!1*K=^C7$ZA+~iUU$OkLt2$ww@Jgy+MNi*I@_>VgFGHpd9x{D z!5|#%5P=BRM+22BR?msoHE9Y@CIVX$E%>HoOM?iIYOcc<@B$5;5$IDnmTzSZ-s_FE zV9m)%gisd^x7JZWmpZT<5s(2FKrztN4l>TwoB$_7Fty9WHxO>t(_b@I;F6RQRr8>d zFlDrWWvzPH#AV|E!bk)#2e)Bf1s2|tXaZ+lqzMzYCR-wn?WSC}WlJ=?%~1G&XV{eC zB~#Smqnw-m8i;qWIHlnpPNgNfVDj`kS@Js5r69OuVdTv^i^**#Gs-xjGF6CMRgKN)#_ z*(z=TP8K6?)`3iJ_KSi=rgZ<^3Y2>>jl5YeGCA+NnT-90&*WQC$Gx3~HtR|zub?ne zy8Q|j;&v1`CPuzjuRodmtY$Rrr}zIZEx$tZnRP0YKd2Q`eiHuD<-Z1uKB0X~X1}k= zap#kgXsa`IfpE&3buW{jPII`qZZ-LRY4T=$%;d&i)25+K{y>_%xqmSEy9_QzGVL1Z z+bB5gH|uRC#}0**l-~dEXn8Y!=Kjm%i%o^rV(d0bzn>;=*6&RIRl}(B^!B;yg7%wc z%sQXRgQh~ur?>wT;9R59hgotx(0uneo!`(Ve;Kme*J0$%x?$gE03sPaMGeyi|1~NY zdq&=@FDAb$t>eeUr;#(`$n`9;7$5* zQBRu|{9@Vxkj^_LgZ#i!WzE#I_)C}PzRz@wlHRM8Jok<|Q#$W_EuY@c&~hb}FcYU% zV&qMJjh1(|!Sb(GDx^YX$zLO90Mcn)lvPF5isQU~mQoCI9{x=Hn)4Uko7P1sSWqi7 Z@m$&gpWgoX4Dv5;Q1aYw>r82+_&+ykD+&Mr diff --git a/server.c b/server.c index 0a2bf1a..2336162 100644 --- a/server.c +++ b/server.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -15,19 +16,35 @@ socklen_t struct_len = sizeof(struct sockaddr_in); struct sockaddr_in server_addr; struct sockaddr_in client_addr; char buff[BUFSIZ]; +char buff2[BUFSIZ]; FILE *fp = NULL; +char *file_path; +#define DATASIZE 64 struct DICTBLK{ - char key[255]; + char key[(DATASIZE-1)]; u_char keysize; - char data[255]; + char data[(DATASIZE-1)]; u_char datasize; }; typedef struct DICTBLK DICTBLK; #define DICTBLKSZ sizeof(DICTBLK) DICTBLK dict; -#define showUsage(program) printf("Usage: %s listen_port try_times dict_file\n", program) +#define showUsage(program) printf("Usage: %s [-d] listen_port try_times dict_file\n\t-d: As daemon\n", program) + +void acceptClient(); +int bindServer(uint16_t port, u_int try_times); +int checkBuffer(); +off_t fileSize(const char* fname); +int listenSocket(u_int try_times); +int sendData(char *data, size_t length); +int s0_init(int *s); +int s1_get(int *s); +int s2_set(int *s); +int s3_setData(int *s); +int s4_del(int *s); +int s5_list(int *s); int bindServer(uint16_t port, u_int try_times) { int fail_count = 0; @@ -77,6 +94,7 @@ int s0_init(int *s) { if(!strcmp("get", buff)) *s = 1; else if(!strcmp("set", buff)) *s = 2; else if(!strcmp("del", buff)) *s = 4; + else if(!strcmp("lst", buff)) *s = 5; else if(!strcmp("quit", buff)) return 0; return sendData(buff, numbytes); } @@ -97,8 +115,8 @@ int s1_get(int *s) { } #define copyKey() {\ - dict.keysize = (numbytes >= 255)?255:numbytes;\ - strncpy(dict.key, buff, 255);\ + dict.keysize = (numbytes >= (DATASIZE-1))?(DATASIZE-1):numbytes;\ + strncpy(dict.key, buff, (DATASIZE-1));\ } int s2_set(int *s) { @@ -107,7 +125,7 @@ int s2_set(int *s) { while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { u_char ks = dict.keysize; dict.key[ks] = 0; - printf("[%ld] Key size: %d\n", numbytes, ks); + printf("[%zd] Key size: %d\n", numbytes, ks); if(!dict.keysize || !strcmp(buff, dict.key)) { copyKey(); fseek(fp, -DICTBLKSZ, SEEK_CUR); @@ -120,7 +138,7 @@ int s2_set(int *s) { } int s3_setData(int *s) { - dict.datasize = (numbytes >= 255)?255:numbytes; + dict.datasize = (numbytes >= (DATASIZE-1))?(DATASIZE-1):numbytes; memcpy(dict.data, buff, dict.datasize); *s = 0; if(fwrite(&dict, DICTBLKSZ, 1, fp) != 1) { @@ -139,7 +157,7 @@ int s4_del(int *s) { while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { dict.key[dict.keysize] = 0; if(!strcmp(buff, dict.key)) { - fseek(fp, -DICTBLKSZ+255, SEEK_CUR); + fseek(fp, -DICTBLKSZ+(DATASIZE-1), SEEK_CUR); fputc(0, fp); return sendData("succ", 4); } @@ -147,6 +165,33 @@ int s4_del(int *s) { return sendData("null", 4); } +off_t fileSize(const char* fname) { + struct stat statbuf; + if(stat(fname, &statbuf)==0) return statbuf.st_size; + else return -1; +} + +int s5_list(int *s) { + *s = 0; + off_t size = fileSize(file_path) / DICTBLKSZ; + char *keys = calloc(size, DATASIZE); + if(keys) { + rewind(fp); + while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { + u_char ks = dict.keysize; + dict.key[ks] = 0; + printf("[%s] Look key: (%d)%s\n", buff, ks, dict.key); + if(strstr(dict.key, buff)) { + strcat(keys, dict.key); + strcat(keys, "\n"); + } + } + int len = strlen(keys); + if(len > 0) return sendData(keys, len); + else return sendData("null", 4); + } else return sendData("erro", 4); +} + int checkBuffer() { static int s = 0; printf("Status: %d\n", s); @@ -156,6 +201,7 @@ int checkBuffer() { case 2: return s2_set(&s); break; case 3: return s3_setData(&s); break; case 4: return s4_del(&s); break; + case 5: return s5_list(&s); break; default: return -1; break; } } @@ -168,31 +214,33 @@ void acceptClient() { sendData("Welcome to simple dict server.", 31); while((numbytes = recv(accept_fd, buff, BUFSIZ, 0)) > 0) { buff[numbytes] = 0; - printf("Get %ld bytes: %s\n", numbytes, buff); + printf("Get %zd bytes: %s\n", numbytes, buff); puts("Check buffer"); if(!checkBuffer()) break; } - fprintf(stderr, "Recv %ld bytes\n", numbytes); + fprintf(stderr, "Recv %zd bytes\n", numbytes); close(accept_fd); } else perror("Error accepting client"); } int main(int argc, char *argv[]) { - if(argc != 4) showUsage(argv[0]); + if(argc != 4 && argc != 5) showUsage(argv[0]); else { int port = 0; - sscanf(argv[1], "%d", &port); + int as_daemon = !strcmp("-d", argv[1]); + sscanf(argv[as_daemon?2:1], "%d", &port); if(port > 0 && port < 65536) { int times = 0; - sscanf(argv[2], "%d", ×); + sscanf(argv[as_daemon?3:2], "%d", ×); if(times > 0) { - if(daemon(1, 1) >= 0) { + if(!as_daemon || (as_daemon && (daemon(1, 1) >= 0))) { fp = NULL; - fp = fopen(argv[3], "rb+"); - if(!fp) fp = fopen(argv[3], "wb+"); + fp = fopen(argv[as_daemon?4:3], "rb+"); + if(!fp) fp = fopen(argv[as_daemon?4:3], "wb+"); if(fp) { + file_path = argv[as_daemon?4:3]; if(bindServer(port, times)) if(listenSocket(times)) while(1) acceptClient(); - } else fprintf(stderr, "Error opening dict file: %s\n", argv[3]); + } else fprintf(stderr, "Error opening dict file: %s\n", argv[as_daemon?4:3]); } else perror("Start daemon error"); } else fprintf(stderr, "Error times: %d\n", times); } else fprintf(stderr, "Error port: %d\n", port);