From fc5f4592fef89673c9987d33d218250b4eea4ae5 Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 16 Feb 2021 12:24:01 +0800 Subject: [PATCH] v1.0 --- .vscode/settings.json | 5 ++ LICENSE | 42 ++++----- README.md | 4 +- client | Bin 0 -> 12656 bytes client.c | 38 ++++++++ server | Bin 0 -> 24224 bytes server.c | 200 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 266 insertions(+), 23 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 client create mode 100644 client.c create mode 100644 server create mode 100644 server.c diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9cd751f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "cstdio": "c" + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index ff183c0..e854f82 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2021 源文雨 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2021 源文雨 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index b1ffea3..a70487c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# simple-dict-server -database["key"]="value" +# simple-dict-server +database["key"]="value" diff --git a/client b/client new file mode 100644 index 0000000000000000000000000000000000000000..6051e6ef2811bc8fe5e1bc0b008c408a6cec9f53 GIT binary patch literal 12656 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 +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc,char *argv[]) { + int sockfd, numbytes; + char buf[BUFSIZ]; + struct sockaddr_in their_addr; + puts("break!"); + while((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1); + puts("Get sockfd"); + their_addr.sin_family = AF_INET; + their_addr.sin_port = htons(8000); + their_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); + bzero(&(their_addr.sin_zero), 8); + + while(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)) == -1); + puts("Connected to server"); + numbytes = recv(sockfd, buf, BUFSIZ,0); + buf[numbytes]='\0'; + puts(buf); + while(1) { + printf("Enter command:"); + scanf("%s",buf); + numbytes = send(sockfd, buf, strlen(buf), 0); + numbytes = recv(sockfd,buf,BUFSIZ,0); + buf[numbytes]='\0'; + puts(buf); + } + close(sockfd); + return 0; +} diff --git a/server b/server new file mode 100644 index 0000000000000000000000000000000000000000..5a321849f784a73a353d4d354b1b3cae3c9fd2a2 GIT binary patch literal 24224 zcmeHvdwi7Dng4lbGRXvzNyu;s7s(qWDk_t36)%y55FG>sxhPt344FwXC7ERB0)*8q zYrGI+Dr{S&ez0h}KWnT0s$Gk&v^Hopy|1<^xb1dn>t$lpMn%gilKp&U-oUH*w``qnI z7SCP0&=+g>&6ne*eac>Xg_Sroqe3CuCxR!&_O1Uu_lJEghyMQSvmWof@o4V4m3LJB z2W89gM;mfnR>#r=@$*0E(WwD$blCx@WHc*4{g3ru?2eaVc z&Vp~sg5RG7k7vPO%7Xtq3;tjh+{_Z6FJ+PEHW_QX%*%pbl?9Jv!NXbb*;(+jv*5R7 z!T)a-d}7MXbGX zODHaynpzXF77^MWj*FIfdn6{B+B-rK(GiM9+oK{72t)Av^8>M1V?(4##NyFNV@Idx zNW^3OX>4hT!e}fGm1t;NI1&`G5PmkZ))WhcwumN*p|NqRXbZJbdGn4?v>m2`=tDGZ zi-zMN(G(3e1Vv+OdkpoCXgCsY5)F-wp^mtSwT40+@T75jL!c=fX=n}a2+@(oHliF+ zAQo?k#sh5);fT0&)rw_xf%(4kQnh&tQ`PytMIx|b{pA649crfA(e;>l-$= zhG4F_tv#a51uW4q1rb$;{HLkKjr?-|=D@yg1ktq-4esBZav!Jn$5X;#9C>rZpJAWa zSNGhF-JesutN6sUa6a{qgJ;plFTH(>Jr+Ksj#ChhQkpQb_3r);=7Ws~e`{ad zG5n&x>nHB#QWC?9zI(bUhASSyZ&6tdYUEqkK5%pxrQ)09nZg4vO8#E*4)T4H{|E9+ z*@4F-e+PL^!GZfFe=~We?!a!z?;y{V9oQ-PD0!ypK!@bNNS-M=aD(JGlV@rUtdab+ z-rg}|NP_r?lla z&gv^6CK8qYuIeeQZJ<8|{+{Y-;F5*dLPoU z7~&tw(f2%r`)P@CHvHIupJW@bZdX5=2gm)GaB?M(o=FKHJ+ANJ7m?Wuf*uZ`hwl0l zT{oQ=PI!9ikN2)Ix;Gp@zdpI`d5KL2M$U^4PeXzyAA`bEuqg&704gKY3*Vn&KRB$EIpa%B z@j?!=l}K-42yFMW==(Zq_EtBbZ!3xq!vyf<5CC3{=HwAT7<>f=pX`Uz0#;nJYO%vV z&}Vrz8Qmr4!n48U@aD)&dUNP$1Cq~RhS1Qliy=`)+qd==-Fhu1(1^8X7zxOHh`o67 zEu_q-@!cjZ_9ti3fb_x%m4RpR16S^WuW5t59i3T&-2iddE_i48c{h5nhWV5K7)Eql z*Fp7`zW5Z3crBFR#7cCPd=sr0aR|yQq5SkP9junWMXR6P<*I<11@dp=PN5#xgHXtf*t69z`0jCNGh&lu#9Tj0 zb!_wI9(1j}xs#T9t8b<9ZYuY16We$~EeNJEmekuFpB$1uy_3E!l@|SjRH}XtrwW$FAO9+ce;J!G=w&to zM`gSPAZgXozj(GK?a-fHc1x!3nGavRf>poyAA;BaXp4#5!rwFL8*)>)ZikZGI6baAB{C_&4rDMkL%|BhA((+lE;l9d&?y{XjecFm_{93M$;?fcT-4;s7S!3+z1ek#!3MU!AVmB9}{ugCT8 zXn~O+n85;c?_l@22*z#|AD(jD^bU@PM}z*JoQktJ&hGl-^ZL4OdM77tV)u8{-=hZe z2kZtdw~rme-sDE?bNcItpaIVy*42k|cldz=UhkrRgKWx|diqj7#K@ijB~+`2hp{ug zt5ljeW;0Q2nK%X$_u5T3q={oR@fBn?)}K5>PQZBF zib@Z2@z_Wg7>ny{8tYy38jnkQ=aP%=25WjYK-4wPYJb(<{^o~hH|2?m>+LC0zu(^e z0^5znKSvN4-kc0-;JB|ey7iOS9O1~s{7;R-G8Yap7?uz*K>yd{C`Wl&1uG$P9k5QIkdCH81qFX~zv#BB6nuvzV)4*5)YfrIQ zxmYFFwxm!fsM&C&*@q(5VX4auHpClDYqc!JUto%6EUv}y7YwzEze!+q?F$vLP3Efh z_ATa?Q0E2aSrx%K6|r$5l4xy3TWfHWxiZvg#;~|`fmsn8CumpHa}^Gr#$`7bn89#k zoQA5Y%1+_Km~9+@SQl@ICt{X4u@HN$W%yfzzw7bGbFH;lbn7&m(1o?ucCNXtAsmle z;}do5kw~a99txWAb~D}*G8`FBWNx%d?NN0oEZy2Taf4LL63vRLBECB{#DQ}%+M!@V_v=t z$`hJnpog%_o`_Vu2FI0!pqCYcmd)iFSb+qJ*oB| zqWwm+Kb)rjV5ugLXa?{Z*d8CH=?|ssUxfDe z(f)E;`@f{xuS5I)!FJr6*8Y`LI}bmnVf&h(BmGZL^}mnp*zSkz?X-o$nEwzs&oe>< zmU)WraxC+de%V>?F?(~CdCt1i<@Z$Gmh1N{>B_s@Qxo+psr6LVdd^zrF(C)}WgfT8 zS)7&$H}VPOR5=xaQxP~7fm0DU6@gO`I2D0Y5jYirQxP~7fm0DU6@mX%5zx;?>F1z$ z3C^Oae&)u+ZGIO0tkdhI7C+S@spqYxD_*aWOjEpm?uzRTEV})plf&)g_o|C>+~|;H zNL6r0N0vU-&U>>gE0lxEEj-a@6+RGQFIYF0CFwII)z|*JR7I}~;m(^Z`dOU4%0Z3y zsfzadh?2)0URiYiGZnApu-qWW2X`fey9kossqEqYhi;deSYDF+1*#p(B9hnRQ0D)~ zh<;u>)8JJquuY0?RrEGR?^g6dMGq+Yf}*b~`lg~EE1IhkYOJl;ffy7QivV!7X=&iSZ2Dx{*rb&yCI)y`ZB zJSWG6CrgFnLGQx-A;ZZx{@WIHd>=sW3=X>B zD5}M-@7)Jug*zebdYr~Z;Urr5K4FLOJP+hiREy|hp>SLXl2_V) zO}m5DU*g9-^Em(o57Q}k*$1c>u0h>h{%cer!}kW<+xUPw4o-OJ1wrXak?>HREt1a@9(H-P=AEM8ujr)M{o4*eh1~JF|MfFSz)uR5 zTtOH9%*K*kfZeaNT5yaZaliXh>U@SD_g}1#Y@_rL2jVFFF7fwYLp`VPQ>q@LxLbIb zTSrh;4&}O;g$36_^+^6l*TZt*Dv0NQ+(j=6IXUt_rHH%mOyVb4FD`6=VE$*Umlj@u zEs=kcb+hnRSk512{VeYs*vuCOnJVwS_{}#Yv&6fJmK>6)@jgYB9Le~-d_gAPC7Cte zc6O30nT_7NY0Ygs0PF_uBw8D1d>c%QcOtD77<9P9%X@?Q#gd78xvHICV(df9cJBsS zn`|rvv(x)aTAN}7z})Pu#BYA7@hAkkyuYP^8OD#m?DFoUfeM3Zx!Zde4a_yZ4`#3T zZZbZ}-0!`QOr>NV^8O>4D#<+NeVELA<1^?y<^3Z~FOa_Vd3oT`AUgRy+E{83pZq&^U1QZbP4a7HJ=e|Yl6L|kCBK6B_}kfi$y==M zlGT3jRbZ$)kJ*}QrN_VD6+&JxQs2QcQ z!LYX9SD+xb-$~)1J!4uOkg0hToWVwTvc`lZA!e>%`xA^-uX?Uo-o62E?5n`ZOIdMB zz_I7LvR~826Wk<@J!{ODlnUn%OZne2Bu~?YRICC~zcd%NZo(ca5brxgaD@tdF)|vUd6L<@y@0lQlguDSKrDtK^#~xZN z>5b+gCGxB#DJr(0wUryku?HuBGs7JGdK!C@ry?jv#{O8R$@E|XbR!#Rdnl@)MH*KntVO(|yb zP-85h_9yBr=;oC6nK?@NgWb%;6e3Mp9%j!nUYI&N~S=uTlnNi{Kj(2*ddnOnqdBwN{a7-3X&jsTz9KQnF z**RN`AAd30akx`ejM`NM6nj4sO68p)NZdJw({u57V$?SP<(~y(Gax%oRxpjm%L>L; z;Dz+~@mjL5FxBl6$a@T9g_jnJ%3-?_NbwY7M0&!AGsg+UWBVMuWEIz@Y2>q zJt83{c_B)X$w~(zmd=!Ngt8Q<+Zy}Qsg6?2f4gY{)1*6af4X$vrQM%_E|n&`JZ;3k zB@mwJGnP)ZqI%}k6<&tAru6P*Q#rsgSIT>KV2;N&DZzv)AL*L-tntPMY@O46LR(5% z!JYgO`x(|NMn*&{*t2Oj$(}i)m*y8jak&$zAb!FGH9qwe;#a;AOun)$60dBm+<-@A zVwJIuhR$&1>PTpLG`uxb8Qa!a*%*s9R$5Ph%;j?ybFF7;L}elttqeyRTNA-hC0-5< zEMBPI6m5m52vg!P7CFsitC5EmMA6ZnZ(NSG7} zf&qowE$EUJtLjn1RDn?mA{j9903Ph&^DdTDB7$lVbu{9kqV|q>ps_s~vKlQ90`$)U zFcBSkx8W=^+}=cDkGp)od!l=faO601efTxLfggwC^pf1ejq(w%TOyZ5`R-E$msra^9%yUXG89%i|=YUM%qhldZky_M*CmiORq91AAT zLgnXk4_^HG8!86wHxrK2IWi;nk=(;6!U>k$CXS91?Kw>i!*oa21X zt?r*X$NQWK_v_9=^Jk86m_C6(ds9;&j@JiQ2l!fJpd*eqDek~F*`Ysb?evG*Iq6H?X5wEpO4-l($e?V_V$j=h>votPCmt^g1ulqZ1R;= zxheje`@722ZX6M&(wN_>y_bNypq+txf6R|3!A)ZO3y9|-QgLRfltYK@&N{`q=yd~Qz zcTLz{*53~ZFP_8?!u4Ynt&ELS-OYtm#>LtD7DQ(#xs5JeIO5={OmbBT}HA>e4? z3&P9*%SUca>*+$}4_eqIWc5~Th;*ig2%DkE)-ZD1iqi7Bx;3(A+7~grCv16O+nK^? z8CID~GKO-mDN@-kU6fPNWKzfGbApP%);Qk`)+t4g)nGC9fYtk&+PanX>*=WFJVuBA zf(Jx_L~o9_Fn`e}7-q1X1cCfaN> zN6usVBsZI!65N-VsX=ihfj~z?aGpi5?Z_>#$U=)O8i^P?N<zA!s zX_;PEf2E3|HI=MD$``svlEfMQ-^^ZuV}EAhd)<6iGqX5_Q}Ef%%;LnE!rn1)m*^W4&lUQV#^aRKj#zc9u!)*6aoi=*H%e@3PT@&?KgI?lIz>X? zPf5p%#SqR=Gm8^nFwoyYv9~$##e@6x4H#R4Q+QMNXKXO~ohbBunRI*-zUyMzAz62d z$#`{dEF350`oh|#<+Ocg!3LvWeb>m2;zCR4yG5D!7=wa{Q$D?#E=$fSP8$tMT;H8Z zZ+42ZbO0RAa*>_y4`(*;HUid!MNP)`<+UyGof&w!!u9<%ZSOo(48-Rw6*unO|8i9chE?YkHFSpGjCQhFvNAf)KL&1$k%t8sKndb=RLvK?`{1fvi8gAZzASiM7JMUc z)26Sh+~1j4gv`wUIOO@Aks7sq)jEsVsc^k|r}oWaGVD-ZFFfk)(gpdk{Qp`OoVOtu zhXU2%!^+XefEUBhi5c_sNhP1Ta>jMck}>v6yu~n>=h$E z+t-@fbxF^W^2kH1?y%^E(v8X={T;P)tY)z|i~SYACt$ni6?Hw{^%BQ+Sz}rjV3*|@ z;PfXm&qLC_XVhZ#7bR}#+JA4%g5Q+||5g^9w?xN^+s}c^yi#$~`-fMhyl2z`=N}cG zx%~ZJ7W-U;;eH@<>6vT!WBD^3IP=GOMj4XuG777lQ!nb@m zeSE^Hp)C{$CfeF?p%$=l@>(-ZbmV&3w{ZRix=sfB9MwxOCO(WwomUt1r1^UH$sN`r2i&Inr9;*mc3hZID<|^XT6m?S z#J1jMiK-PXe#9+ZOD$qp-&jj;3Iy=wGd1B-*U~bt$Nb=#{0Lj71^XA-(%VKBkFbQ0 z(IgjNGBCXWCw#HaHmtaS#-kQ((KTH4hoT+A7r`Q@uXfprx$%Z(#o?}kZ*wAy?@@+> z!bh&90bjNA1v?|KXHl%d$`-8e$HG`RvNHj+MMJF(R8X}JtSR_pa`{m8HMfI}b4kX> z9Up|+JTD7JZym zto&Xmmp-(9pQ>nDh4T^?+`^G@()xNi<0{}3(fWE_M^pWLCq!h)jNkP@`Rt_D*Xuu; za(pb>e=Vo!7PRqMOwH?cB28i~0f0_DU2F94sKNh_{r75mt(h7aGmu@h2eZ7vQXW+lgn0gzZ&`$Dt7<%`kAI`jZ=${nm^xB`g;56>nTlV>jq^( z`>hQ=o}sVT<21cf3o4o!e?Bci|8+Nd-A+@#ZczG}{r?O&*PPTeORewe?-ggtYhKe= zpv$K@w7y;k96A>uik7pu5nkheL<4hA>+AJG{XJ;?-DjPjT2F7sz0l?OwZ2|gO!@$# zl(NxQw7#Zqqs^|Lx^Azsl+-glDGORp14F0~)BWq~iHS;o<18&{Q8S&D*R$+jiKkk% z{+twIRrGK)JqcLX?V{DnV5Z$n*+KxB811wv#lOp#0GYB=v*-_=Z+SB`MhQ( zMorg6mj0DGuogQ?c7f8*9OqR_Ero>Mac1c2J}=JF|1XwX3Ym7bo-!x>$rz&5RBw@^ v>gGr}*!lR=`J<0t3~$B|rQ*@ml8DDMCVXc96SC; +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int fd, accept_fd; +ssize_t numbytes; +socklen_t struct_len = sizeof(struct sockaddr_in); +struct sockaddr_in server_addr; +struct sockaddr_in client_addr; +char buff[BUFSIZ]; +FILE *fp = NULL; + +struct DICTBLK{ + char key[255]; + u_char keysize; + char data[255]; + 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) + +int bindServer(uint16_t port, u_int try_times) { + int fail_count = 0; + int result = -1; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + server_addr.sin_addr.s_addr = INADDR_ANY; + bzero(&(server_addr.sin_zero), 8); + + fd = socket(AF_INET, SOCK_STREAM, 0); + while(!~(result = bind(fd, (struct sockaddr *)&server_addr, struct_len)) && fail_count++ < try_times) sleep(1); + if(!~result && fail_count >= try_times) { + perror("Bind server failure!"); + return 0; + } else{ + puts("Bind server success!"); + return 1; + } +} + +int listenSocket(u_int try_times) { + int fail_count = 0; + int result = -1; + while(!~(result = listen(fd, 10)) && fail_count++ < try_times) sleep(1); + if(!~result && fail_count >= try_times) { + perror("Listen failed!"); + return 0; + } else{ + puts("Listening...."); + return 1; + } +} + +int sendData(char *data, size_t length) { + if(send(accept_fd, data, length, 0) < 0) { + perror("Send data error"); + return 0; + } else { + printf("Send data: "); + while(length--) putchar(*data++); + putchar('\n'); + return 1; + } +} + +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("quit", buff)) return 0; + return sendData(buff, numbytes); +} + +int s1_get(int *s) { + 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(!strcmp(buff, dict.key)) { + *s = 0; + return sendData(dict.data, dict.datasize); + } + } + *s = 0; + return sendData("null", 4); +} + +#define copyKey() {\ + dict.keysize = (numbytes >= 255)?255:numbytes;\ + strncpy(dict.key, buff, 255);\ +} + +int s2_set(int *s) { + rewind(fp); + *s = 3; + while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { + u_char ks = dict.keysize; + dict.key[ks] = 0; + printf("[%ld] Key size: %d\n", numbytes, ks); + if(!dict.keysize || !strcmp(buff, dict.key)) { + copyKey(); + fseek(fp, -DICTBLKSZ, SEEK_CUR); + return sendData("data", 4); + } + } + copyKey(); + fseek(fp, 0, SEEK_END); + return sendData("data", 4); +} + +int s3_setData(int *s) { + dict.datasize = (numbytes >= 255)?255:numbytes; + memcpy(dict.data, buff, dict.datasize); + *s = 0; + if(fwrite(&dict, DICTBLKSZ, 1, fp) != 1) { + fprintf(stderr, "Error set data: dict[%s]=%s\n", dict.key, buff); + return sendData("erro", 4); + } else { + printf("Set data: dict[%s]=%s\n", dict.key, buff); + fflush(fp); + return sendData("succ", 4); + } +} + +int s4_del(int *s) { + rewind(fp); + *s = 0; + while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { + dict.key[dict.keysize] = 0; + if(!strcmp(buff, dict.key)) { + fseek(fp, -DICTBLKSZ+255, SEEK_CUR); + fputc(0, fp); + return sendData("succ", 4); + } + } + return sendData("null", 4); +} + +int checkBuffer() { + static int s = 0; + printf("Status: %d\n", s); + switch(s) { + case 0: return s0_init(&s); break; + case 1: return s1_get(&s); break; + case 2: return s2_set(&s); break; + case 3: return s3_setData(&s); break; + case 4: return s4_del(&s); break; + default: return -1; break; + } +} + +void acceptClient() { + puts("Ready for accept, waitting..."); + accept_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len); + if(accept_fd > 0) { + puts("Connected to the client."); + 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); + puts("Check buffer"); + if(!checkBuffer()) break; + } + fprintf(stderr, "Recv %ld bytes\n", numbytes); + close(accept_fd); + } else perror("Error accepting client"); +} + +int main(int argc, char *argv[]) { + if(argc != 4) showUsage(argv[0]); + else { + int port = 0; + sscanf(argv[1], "%d", &port); + if(port > 0 && port < 65536) { + int times = 0; + sscanf(argv[2], "%d", ×); + if(times > 0) { + fp = NULL; + fp = fopen(argv[3], "rb+"); + if(!fp) fp = fopen(argv[3], "wb+"); + if(fp) { + 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 times: %d\n", times); + } else fprintf(stderr, "Error port: %d\n", port); + } + close(fd); + exit(EXIT_FAILURE); +}