From 27e21e7ed1a7b12c14509302f21e4bee7f52f880 Mon Sep 17 00:00:00 2001 From: Serafim Date: Sat, 14 Dec 2024 05:52:57 +0300 Subject: [PATCH] messages --- client/client | Bin 30896 -> 31488 bytes client/client.cpp | 57 ++++++++++++++--- log_data/2024-12-14.log | 14 +++++ server1/server | Bin 61040 -> 61096 bytes server1/server.cpp | 122 +++++++++++++++++++------------------ server2/server | Bin 60560 -> 60992 bytes server2/server.cpp | 132 +++++++++++++++++++++------------------- 7 files changed, 194 insertions(+), 131 deletions(-) create mode 100644 log_data/2024-12-14.log diff --git a/client/client b/client/client index 84d945e8eff6178bb430b0ab59f53f502e7ae0b4..2e727e470178d31e0a26f923d72d2d65565528ad 100755 GIT binary patch literal 31488 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 msg; + if (send(client_socket1, msg.c_str(), msg.length(), 0) == -1) { std::cout << "Server is not connected" << std::endl; } else { std::cout << "Message sent" << std::endl; } } else if (command == "send2") { - if (send(client_socket2, "", 1, 0) == -1) { + std::cout << "Enter the message: "; + std::string msg; + std::cin >> msg; + if (send(client_socket2, msg.c_str(), msg.length(), 0) == -1) { std::cout << "Server is not connected" << std::endl; } else { std::cout << "Message sent" << std::endl; } } else if (command == "timer1") { if (client_socket1 != -1) { - int* client_socket_copy1 = new int(client_socket1); - pthread_create(&t1, nullptr, &timer, client_socket_copy1); + std::cout << "Enter the message: "; + std::string msg; + std::cin >> msg; + struct timer_payload p; + p.client_socket = client_socket1; + p.msg = msg; + pthread_create(&t1, nullptr, &timer, &p); pthread_detach(t1); std::cout << "Timer created" << std::endl; } else { @@ -151,8 +183,13 @@ int main() { } } else if (command == "timer2") { if (client_socket2 != -1) { - int* client_socket_copy2 = new int(client_socket2); - pthread_create(&t2, nullptr, &timer, client_socket_copy2); + std::cout << "Enter the message: "; + std::string msg; + std::cin >> msg; + struct timer_payload p; + p.client_socket = client_socket2; + p.msg = msg; + pthread_create(&t2, nullptr, &timer, &p); pthread_detach(t2); std::cout << "Timer created" << std::endl; } else { diff --git a/log_data/2024-12-14.log b/log_data/2024-12-14.log new file mode 100644 index 0000000..eb41eab --- /dev/null +++ b/log_data/2024-12-14.log @@ -0,0 +1,14 @@ +2024/12/14 02:47:49 Socket created +2024/12/14 02:47:58 Socket created +2024/12/14 02:48:44 New thread created for socket 4 +2024/12/14 02:48:55 Got new message from client 4 +2024/12/14 02:49:26 Got new message from client 4 +2024/12/14 02:49:26 Sent new info to client +2024/12/14 02:50:05 Socket created +2024/12/14 02:50:08 New thread created for socket 4 +2024/12/14 02:50:17 Got new message from client 4 +2024/12/14 02:50:17 uwu +2024/12/14 02:50:27 Got new message from client 4 +2024/12/14 02:51:36 Connection with client 4 closed +2024/12/14 02:51:56 Socket created +2024/12/14 02:51:58 Socket created diff --git a/server1/server b/server1/server index bd1fd71f23a529908eeba9908fefdf3776f56808..df76df4b7e132e0d22c1e6e1ca13e4eaddc832a9 100755 GIT binary patch delta 19533 zcmaKU30zcF`~SVeTtEa_1O^Zg1b0DjNzDz^(J`0TCCV%pQgR751eeMNLyBpfUh>2n zr6&D;W?7mGW@f3lBxz{cVrnk958^_$`Bpan?{m(*Gndid|N8Mh=X{^#JkN8Md(ItZ z8qWB9aMq_ZDzvn>#IFoNqz_(i|9(J42T`l&@cQZ0fRtgPmNJZm$*H4{M2f0Lr4Uh< zL45JQvd!{WiMcNejyGLq5co3omf>HC|Cjwms{KW* ziO-zyt6TOAczXK9KXT^m8dLsD_uRLZ2S3M_`?QOj0$ZA^VR4`N$Sb-@giXW$ne4dF z5GCGElET;)LvuNU&0816GMkv>A^hH(W%`=rUcB6iB`PL)5!-7t$q7sjFv+)AHp)x5 z%srNFG_jsal)Q<{T_zqYMEz;5eT2(C!OPX`g3?+3o$ZB!T=Qxd}(VV4+Pq%dc|15p-vBn?%Xq zkteJIr3*Z3x5!In6*^aBdo1yl-CFFd{JkhSlG}TfTbjh9dYL?9ivpt9vA`%+^?sDx zgGc@gmpnv~D3jeb5}HQIFY>+^)ih0>PP)n#jVrI@c3W_}VZ6MJY_X8QG`Sy->?eK? z_l&n3i9Ps6xxh4H+5z8I)hL8R`GBmC{f0x;9S!?lp52bow#pfMs; zY9Uo@5onakokjix^a&KY(R0~LL2bHB1M@*m*nI@PEMFMWn&=W(c{(UfX6Bf#D^514 zd?h%^mszXReY3}!M-7`&`Cf$Gz``TC`VUMuj~O<$+oZ~rs1Re=-2CZzIoVSu%__*x zSu`nk&Xi|apV*l2#&E%GVpL|u?vYvZ_;fZPK0)?j+3`L643dxJC;70I@m<-m_*mva6F>rNYK0r^G8->&2PjCdSciqyot+!&<`Dt{C> z;WK6gNm5g(HTWcAnlZx)po!F31-8BZA9Rzy)Jv@w#LQ?S!Qnw9jZ2n{(gD>V)fXS% z1cw8pQL6lRo1VoA<0nl}>-p_h_)E~4uGZ(>eG}bnkn&Y~B_C#x8ER5obNdKdsxFKg zo|P@|axXls59^T7Av#A@CsMUZRA`-zW3v)W(bELL@5gl9M7A2-b~dr3>r9)%c5ulxt1A~s~(3b38k|{dDlR2qY$8E(@l1(K7(EYLnc3w3A@7Ssm$2U@B_d$GPi zR{^cip}pBGpfx}@>(IVzHPF9-R_W0G>2lYg z?M$p4dV%eccOCi!3u=$N11;5| z6IfrMtAJMM&`E4odsFmeo&C)^Zg%Cn?VnXvq_y(j`hq0gakZ|j?2z`HVxCS;!mDo9)w`1~eRTlUyL;7Byy~r4yWUBok`g7!6_Etqug|0gw_L_^XmRw- z24Zn2YWs_^B#aKB->g0H*OtSmp&=h z5s>dcuH7RLw(MD+7;uB35JmBn5r43DU=uycKU$9zo;d$EPv8c_wUrXH=2!7N2< zRb+hjU24u;LFK1Kxsb|_@iKRmszcaAeUl?w0j&34m*R+Dz+`i%M@BYz<mSSH4wcnxTAf9*gRi zZ2bf4II@=k0ecyViR{%1SY)n@xJcm2Ovs7^My8S)W!E8OBAAESQe+o7%BtWQ7CQg! z1RZ;EJ8q0;(2_aAZLuB}-6{O&cb-C?wl%!$j=oe>xl72vQX$EcUBLYNCmTln&gS)P zKA|@ly2QHmle}=vP}9b^nOpq*H+QOkqA~dx#vX;h)(nkcmHpdy%gk^G@B(zsUM$WCkAZ?>4-YEzgLuj-x0~1Sf=F^CI5+a2V*+~$3?M;uRWOA{%D)@~m_|#REBcJ}_ zaguT2B^jU5$heQ>G_f|BT_V^13LEwiOVRZxi#^ODA0z$SY<6a}T+B)`+sQR-OJ;bB zZ~D3YkL}3go1?~mmeppCv97|3gXXFTbd*(a67+&csYeI!?Zx9b!y&{XW_$R3VHCqf z7=Q;@>nQu&5UTZ}TBx>pMpSFns^b^7Wk4tSJUchQWT^g)?HwE`&tc65nhcNMVLzkN zpYNwzwv57Sslo_Q8P zAJjZ7$;+JO7uGg2-Sk5Pw7mN|;a4^%Gs>{Nf!Q+K%J*2IIlP60mp^JyBe1zcP+D&{ zW1Gye@={h~PO}!aN5qN??In5b%f zzW+A$xgp{XJ3k=OaPMd8bmliCgvAZ?mmREOu*pzxi}fEE85&25qT2@`toD=~tFYJ(VkV!TAzE2T{-_V8k8bdCAvL##m)$F5siARJC#&N#bJm;=BKdus-1V*pDvOkaag%)v$2uDA=@f3-D(C z<+%tCck{Kv(@p&(o2+d$In(EBj$DTnpe1{8Rh$P4d8Qc22c)G`6NQZNB34xy{B7 z?``i*aQ?k;^8-3R=xU{$h1d2L#Th?QIBY>egb2I ztU=CRMlOow;-LuMh(uEzz6dKbJyvqXBALMXRtL$6C%G6n0lfc;IU6C}p$!RQA!$^T zoV-d(R1FtZ-UzA+uYNKaTsu$NXULPZvk*6M{m@NVtxi%hi*^x_g0010g86_b^1>ew z#g|LT%qObyBvTx`I)<=eCj4rR&4v7(FBAb)(Z5A=qrb{ zIS-?X_fi=#Fk)m+82jTmpF8Go2(gG(=>SC<4v94I{%|sx!+Y@<%Uu1EUKb`YG;C|a(}=L71auIA5{aYb-s8j@PK|@9mZkda9OQY zM4aBm9np8OT!8x_I#%!XJY7s^=?Sql(wu(vN+YMA7gf#aTv45@dbxy#qt!DTNAd+q zoxJLyqqvX@^A+_S;h6TgpCpF9>LPn@tI* zc8-AFvZ~-^{Q3hp22L<0k0Pg?@t0ES}K)cvJ4s zdtyF_(5rkrq2o;a53TTF>i~KdPO{7?Jl6 z7Ut3PQ3ce&QmbZ6?7#SG3I&y8vn`bKe9eYKN_-4X&g3UGr!?+P>lXgi=1A3m%7iP$sJU^|2l3@z{snkBa5cn*(+ zKf4oXnxe%*K8T7XK8Ms`976V}h2oDEbBPO}I+`*MI)nGXI2q1stcN)3pl)wrv7LtK zY%W^-HFvw(`ERkv@v1s09YNpGOAs*>&quoZ!%8hB;6Q*@61e|x;5@Ht)?U*258zhB@J2-Ka$oDwW6UJ1Gb zACK1bZ?v?u5AeckRqr|guPbuf(whqQQqfHPakg<2R?XIVFzR|f(AEJj9nIDTFI+SA zh8JF?y8D6`UICo<|5PyQcA-x_>C(o+P%j;=?Q}0(Yde}uMmli-0x$Vkk~~Mn;t0fG?$2Z6%zH<`wevAZ0mSp z|LcCX0nX`%g*Gudki6&3vU`?(`%`1QP|g2N;JQiik(Zb?LzQDfEqpEmYG6N}e zUOtCgD8%U{;%JnxM`4UUqYhrQEW&R-sXGoW2Gt41zbQX?(i>y*(~IJ+Oi;yn9Nii$rh%J@+cD1wYoOjuQpu@jH? zv;KsDAzelIZ5R?|YGWxS3+Q?cbwr$}_i@5r8=PjARTXsO@{WkZ9!{X(#HgH4Je)f? z5a4<0w*#YJ!siLNrw|bD^hFzX^A~9C3-s6SU~t5fZI;$JSm~!&)woD&^eK2L2FX9* z(jcZIK8=d$`VoP1z4K*}i*kNAMMCIJ;%*q{fk|izuQAK2;KIWQSmK^i=#PyR5-(E1 z?GdkxafiL(Co9I~5F~8}7BFmZ5sJlbE~i9oIStlrye6=jON*A2x(ed)(MS!~t#)pM z*Un(l!(uMgEhRmN`2*6Ug$HkSJ`f2DdYj%{il^5aB!Z)my2N+r=BijyF`eW+#np$w z$vyOz!g=8|Yj~oKwF&I$&TBI75F#xI;OhvRA>J za5wBUTRlE{(5HA6;_j1&ks;0ZNO-WL@k^L`>U+CLTQJIXqg?o?weAu2=lG=T%_kZy zMndW*(h#Gi5PmuT;uiGphG^hmC$z+Aal{>=3FA;+rvC4>Kfjr!s6N4BJMYXQ(^pyM zyl}SS$u#Syd|qL-pgcO18x@DEx zEy+RDI`ONWPOhgM`j=*UAr~Uk1y&ALJ6r2)FK%SpnW)*$R&5^&^w@R?+q2!a`?zh# zsHPA9$RisF#^N;6a4sTK1ZB;Ke$}M+q2F?@+)=FKf+zvYtO2+n=hj$Y~MKF zH?p&nt0L*M zF5B^)7QP~N|DT~$t>#Ou^BX#g+RbH zQ8s=`nrSO<2oBOyV;^6V&O1jOXYWplFl;~0c1(#kT>X}voHECd6U&B9jWZ06Wz(m2 z4GYClGxajf{nr`V{on zSHcKiI2WQ-Y9jYO@tcR)@#)=T7f?eGXyF#Ps}8?ahgqu`W7>apm;@-zJ3MKgLLL__ zsgmgLB*fEsJzG7ao%|6yIHP6ck2PR>efBW$YxdWS&WU%3h4%hXH2<~s7Lg}*^NN`r z5kcV_`M zJGBpaoIk>ReY|Hx^GUnnAi0e0sdg@;xXFfn0xQiAXOm`zHEC1Lp9ybNG4s5{k$tFL z-nF%)kV4g7`wIq&maCny0BBEVH*@|yo_-n$ys2BL@=YC|;blLwZS#_tWkxGj^{lTo zkWTA1=sB=t*t5_byo=9}dk*t?Jfoq-p)r&WN2A504P}a?;MA++6d6JJMJn^Yt#%GT zBs@zP^qysC15bHYEi>l^Ps{p}i|o+x$H20F8Rcf<$gIfOKInTg$_M^mP-CS}K-j2)aN~4%&tA`uF|H>B z1-U6(Gi#dc%lu|{j5#6J7>oej0Tv&L6&_^6XTRF*+<&=o$}R8c>mt`qd1~uq+*=1(<(!8i4ymgnJlA4A;KTlz(@mbqy3S1wSQ$(+2{U*<%bwfAdXXBl=@*6! z_{_VN)-w@C9E}-Xt#)1@Hecw~g@Zq7e!5?2`aW!Cpr!jrv3Gqp(Y4rz?d2vr^Yk@C z8k~!9Q#;;y*3;u*aM0=C=CRLVN9PSO^xe-)dHq{_`xkjalcCCDM@)RE^J%h!&C826 ze6^1)&l_bJ{ueu!*URwAZ8owX(vY-|rO)q(KgF0ZKhE&$Ey9#4_(GQ3vfc9|;^|MU zsM{?z1G(SmF*9W^`+0u3q1PT}&tG5|T}8GG&3KCd_V5AKoSmD~l)YRqC!iRo zF3PmBo4E>lSZk`tU45oI?B*>|Cu^DZ6KUaD`I^}GW!n73eM)0?{r@t(mMfUsahrEx z(>Vp6YMHJ^Ssg%sqv%|?o1I-S1Y?8?6y5N*6dmy2kG~N7&bYPkU72lMYGPk4eJ^Z& zPTqo?ymToydw%|;oV>g_d2G!~3DzkEdGqJwO`1Dr{*3$?b7o_!HG4sJ?u@Akc{%e6 za^~l!CS)$io{^jVbZ$<qFbmpZWKMfq%1(YDIT%Qnl_LTqiY=aaUrce%EqJav=Hbp~`9=&zv3 zpSWD~9g3jsF4q@WEjodo0p0Sc%Voscx$-lYs}tx<^uwc|-O!0IfL_C>T?-nH=~Dyh zi=EJ~pyRR83HOzxXRv4L=8KO~Ze#0KgDq`aY!YvP)?xb_j_tDnd;CE7+#a+O=uOb! zpdE3pSPuFy&PLln4}yLVdj6ct^*3n#d6z2|4qgZC11jNF!c(A$pf7-?fvy4_O}H;! z3LF7lde!Bc3wji^6!bFaX3+Pq zxm+hf?||L~?dx>8qOj$$gZ2dd19UQI>pGXK(2BxF6xM>CyN*nN%Js+uXbNZ`w(Kv0 zb^=`mIvjK-XfEhCpvysL-ax~kV{rUB26`OyF6brDD9pnse8AlkbOK(ZPX^rxS_s;z z0SAD!C=5j50O)?u%b;!WYSoA@CoBU^2Hg%i2($)tD(Gp@WuU);t_7t(OgR9W0eTs< z4Ah9OybGEPnu>*b5a@h7mU2ODpvytu{MF^-+7QUzDQP7avb`lHDJ{qUTiB0-RE8wUdF<|2Hup>EkTpO19G$Z+P((J8g@faUH`mn$T&;tk$Zz z$j7It?6&*@_&;Izmcfc!#<1MYUj;s$%nKUvbKU$ez+cBMI7|WL=NZ&i{luER9@FM; z6jwtLOOwa&V6MkQj>QCB&PA0zC=O*8UTqm**@Dd$6pag6fIYs;ds|(u>r|bOL}>w7 z5Wp!B0EK=4{At@qlxLk*+y39-MGaueQsfDA>&7Zqmm7qrY){5Tz z{}|kI9`Ep?wH(DbERiGih74wIi3}Zsp<&?X zlA(oI_q0JkdC^VJTG;tFg^W`#V>r(RC;`*a z#&dWe(MM56KU6#kU>!??d>29g_$Ah_G{(0a#r>Dq#L}45V-P$EE&3LpaT9Xr(em-> z;YnL9RDQe64nv#1Ue@{wyIvaan~dUuE3_c_4nlF^6_$$PR1|-_!bYOF48@qMY&ME( zQ5<)by@uie6lY##AES5~#mQIMQ521sgCno9TPP-@Xt~Oot$XV9vnUMLctPFkfS~{2#&GfQsuHZ$A(Zx8JVu_B)|?=^C}4Ivm9o zI7au>=NkPn6WOL*Q}bQH-$z*+#wM~D-#4IgkUdng!HQ+9e9(mp?BX_U0lU#W?btf&2z z(iT#kzj7@~I@E;9y8@KAqotYv<)vuJ(ez;;+XIy&(bAWJ$|up%%R%#iTy3Tl#z?<4 zQ=HM#_F$4ZAEIoIk#2=30YOdUkk#00s@EQ7F&6TfWq@TmdmtzrcVl?5; zTLYfTW1p3U2i6*;tFrR7Q7SR~&Q6u}2?%V55!P23Bu!w!|LIuS=Re8DZ0$>m+Lsd3 z`cTq6-{7OKZ0hUu6-|AezCo$4(^o+C^$Sd1*)lZYd4b|Z8ox?d`pTAaIUBvQb7IeC z0)zA7!n#EldX!&9?A?`}Lyv6`H9Ri(HJ4pj*)lAxm8fBQ@T)w5g{>NySl&`pT`t!g zDj{rsVLQd^U$CXCrWqZt|?l}qb6E{f-FT!C2aJ&o#o|~OW*xN?(*a$!R7-S#r2pZWQnOb z4QRSfsd!d4`|y8L+EO-;x(1*exPYvJ@p%u*9_{`55c9c9Nk@9(#LjYRqrX z2_ZGJ(i=zseVKT6HoLfXupxQ@>+oJ`OyO`LMUQ&A-a-$M)Zj%d@4dl>=Cj$(_twda zS@yai2y*?pA?>}t?@XIn(#U;ASV$B^`Y(%q-)h)BpS}J5;27_3D(}OFl$73H%>I0T zu;Ki3Y`_PphKeC9?}L8wT>kC#B7Xl5-J@&ZT^Pi_eM%Uo4Fg@rIX4O+lCeVt0>wuI z{Cb>!pM5&ZTyGk>7&7#|YpGK3GSn>p2l%_NUA0W$hXj$1s`4e<1fY&b=_Gr1y-B{p zzmHz7L`9FlP^Y%n&lYkcRsFZvmZtny1k&%S5`U-?^eCpw9D+T%Ax6@^W{ZWBU)e1C zLzDa|zZ+TNNA!(<+@pttA_s<0Nt;HhxHN*e=@Y>vKX$3T&{}1`tm3T}2>^eu!LQBS z@NHC=To_ahZwu}}aLRQxZ}8WE1CJGB)(SHQFrp=*kY zPhBkP>I|3OQ}I#L1g|9j)W|n}Z>1_1JG&XUMKBmfanJSoc z4x{TjmwA|Nf#jQXPv43aKg-N>TAqYO?nWSeg%<;u`yi0O*`XSFw-}lh&y%E*H48fhBG+$$zk)H=E*&7||gZ zRHf?RQAMOCzzQbj&daqo$yunSvELn9M}R)acmZm3!VRlKKa4XY@> zn2OI;DtTkcXkfY&I;u%*)IAic9WXRHmyNEo%A48o zy3Rqz)OCSV78=-`C0tJkZBS8-RerqONeb)ajRKsDN)9k1`)#QjrTtjUcYO|;*cDQ81btN2i8R506( t9`0k+u~h<1W5;h;@oQ6~Z(8Mc?D)+dO$t919DFVIRuAm_hTdxX{{T+uQ*ZzP delta 18195 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 C%cc7O diff --git a/server1/server.cpp b/server1/server.cpp index bd72f74..44afb39 100644 --- a/server1/server.cpp +++ b/server1/server.cpp @@ -50,8 +50,8 @@ std::string last_log_messages[CMD_LOG_BUFFER]; // Amount of active client sessions served by different threads int active_connections = 0; -// Total amount of handled requests -int handndled_requests = 0; +// Mutex to change counter +pthread_mutex_t conn_mutex; // Log pipe file descriptor int is_log_ok = false; @@ -71,40 +71,10 @@ std::string get_last_error() { return "Last error: " + std::to_string(error_code) + " - " + error_description + "\n"; } -// void disable_buffering() { -// struct termios t; -// tcgetattr(STDIN_FILENO, &t); // Get the terminal settings -// t.c_lflag &= ~ICANON; // Disable canonical mode (no buffering) -// t.c_lflag &= ~ECHO; // Disable echo (no terminal output) -// t.c_cc[VMIN] = 1; // Set the minimum number of characters to read (1 char) -// t.c_cc[VTIME] = 0; // Disable timeout -// tcsetattr(STDIN_FILENO, TCSANOW, &t); // Apply the new settings -// } - -// void restore_buffering() { -// struct termios t; -// tcgetattr(STDIN_FILENO, &t); // Get the terminal settings -// t.c_lflag |= ICANON; // Enable canonical mode (buffering) -// t.c_lflag |= ECHO; // Enable echo -// tcsetattr(STDIN_FILENO, TCSANOW, &t); // Apply the restored settings -// } - // Returns info about current cursor position in console std::string get_cursor_position() { int x, y; - // // Disable buffering - // disable_buffering(); - - // printf("\033[6n"); // Request cursor position - // scanf("\033[%d;%dR", &x, &y); // Read cursor position - - // // Print the cursor position - // printf("Cursor position: (%d, %d)\n", x, y); - - // // Restore the terminal settings - // restore_buffering(); - getyx(stdscr, y, x); return "Cursor position: y: " + std::to_string(y) + " x: " + std::to_string(x) + "\n"; @@ -172,14 +142,6 @@ std::string get_vmem() { return "Virtual memory of the proccess: " + std::to_string(100.0 * not_free_mem/total_mem) + "%\n"; } -// Returns message to send according to the server type -std::string get_sysinfo() { - if (SERVER_TYPE == "server1") { - return '\t' + get_last_error() + "\t\t\t" + get_cursor_position(); - } - return '\t' + get_mem_percent() + "\t\t\t" + get_vmem(); // TODO: vmem -} - // Writes log message on screen and passes it to the logging pipe void log(std::string msg) { // Add log message to the screen buffer @@ -242,19 +204,22 @@ void* handle_connection(void* arg) { int client_socket = *(int*)arg; delete (int*)arg; - std::string info = ""; + std::string info1 = ""; + std::string info2 = ""; log("New thread created for socket " + std::to_string(client_socket) + '\0'); while (true) { // Recieve message from client - char buffer[5]; + char buffer[128]; ssize_t bytes_recieved = recv(client_socket, buffer, sizeof(buffer), 0); - + // If connection closed if (bytes_recieved == 0) { log("Connection with client " + std::to_string(client_socket) + " closed"); + pthread_mutex_lock(&conn_mutex); active_connections--; + pthread_mutex_unlock(&conn_mutex); break; } @@ -265,22 +230,57 @@ void* handle_connection(void* arg) { log("Got new message from client " + std::to_string(client_socket) + '\0'); - std::string new_info = get_sysinfo(); + std::string new_info, req = std::string(buffer); + log(req + '\0'); - if (info != new_info) { - info = new_info; - time_t now = time(0); - struct tm tstruct; - tstruct = *localtime(&now); - char timestamp[32]; - std::strftime(timestamp, 32, "%Y/%m/%d %H:%M:%S ", &tstruct); - std::string msg = timestamp + info; - send(client_socket, msg.c_str(), strlen(msg.c_str()) + 1, 0); - log("Sent new info to client\0"); - handndled_requests++; - } else { - log("Actual info already on client\0"); + if (SERVER_TYPE == "server1") { + if (req == "last_error") { + new_info = get_last_error(); + if (new_info == info1) { + log("Actual info already on client\0"); + continue; + } + info1 = new_info; + } else if (req == "cursor_position") { + new_info = get_cursor_position(); + if (new_info == info2) { + log("Actual info already on client\0"); + continue; + } + info2 = new_info; + } else { + new_info = "Invalid request. Available options: last_error, cursor_position"; + } } + + if (SERVER_TYPE == "server2") { + if (req == "mem") { + new_info = get_mem_percent(); + if (new_info == info1) { + log("Actual info already on client\0"); + continue; + } + info1 = new_info; + } else if (req == "vmem") { + new_info = get_vmem(); + if (new_info == info2) { + log("Actual info already on client\0"); + continue; + } + info2 = new_info; + } else { + new_info = "Invalid request. Available options: mem, vmem"; + } + } + + time_t now = time(0); + struct tm tstruct; + tstruct = *localtime(&now); + char timestamp[32]; + std::strftime(timestamp, 32, "%Y/%m/%d %H:%M:%S ", &tstruct); + std::string msg = timestamp + new_info; + send(client_socket, msg.c_str(), strlen(msg.c_str()) + 1, 0); + log("Sent new info to client\0"); } close(client_socket); @@ -298,8 +298,8 @@ void* draw(void* arg) { // Print configuration printw( - "LOG_FIFO_NAME=%s\nSERVER_TYPE=%s\nPORT=%i\nMAX_CONNECTIONS=%i\nCMD_LOG_BUFFER=%i\nCMD_REFRESH_TIME=%i\n\n", - LOG_FIFO_NAME.c_str(), SERVER_TYPE.c_str(), PORT, MAX_CONNECTIONS, CMD_LOG_BUFFER, CMD_REFRESH_TIME + "LOG_FIFO_NAME=%s\nSERVER_TYPE=%s\nPORT=%i\nCMD_LOG_BUFFER=%i\nCMD_REFRESH_TIME=%i\n\n", + LOG_FIFO_NAME.c_str(), SERVER_TYPE.c_str(), PORT, CMD_LOG_BUFFER, CMD_REFRESH_TIME ); if (is_log_ok) { @@ -309,7 +309,7 @@ void* draw(void* arg) { } // Print statistics - printw("Active connections: %i\nHandled messages: %i\n", active_connections, handndled_requests); + printw("Active connections: %i\n", active_connections); // Print logs for (int i = CMD_LOG_BUFFER-1; i >= 0; i--) { @@ -380,7 +380,9 @@ int main() { continue; } + pthread_mutex_lock(&conn_mutex); active_connections++; + pthread_mutex_unlock(&conn_mutex); // Create thread for each connection int* client_socket_copy = new int(client_socket); diff --git a/server2/server b/server2/server index a3d07bab03a52e0c9e06ccad4ecf22e227e06e52..4eb930eebf5344c26c75de6cb4477e9f7542eff2 100755 GIT binary patch literal 60992 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 literal 60560 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 N!8uO1WU!#x{{vY&IsO0u diff --git a/server2/server.cpp b/server2/server.cpp index ea86c4c..f738e5d 100644 --- a/server2/server.cpp +++ b/server2/server.cpp @@ -50,8 +50,8 @@ std::string last_log_messages[CMD_LOG_BUFFER]; // Amount of active client sessions served by different threads int active_connections = 0; -// Total amount of handled requests -int handndled_requests = 0; +// Mutex to change counter +pthread_mutex_t conn_mutex; // Log pipe file descriptor int is_log_ok = false; @@ -71,40 +71,10 @@ std::string get_last_error() { return "Last error: " + std::to_string(error_code) + " - " + error_description + "\n"; } -// void disable_buffering() { -// struct termios t; -// tcgetattr(STDIN_FILENO, &t); // Get the terminal settings -// t.c_lflag &= ~ICANON; // Disable canonical mode (no buffering) -// t.c_lflag &= ~ECHO; // Disable echo (no terminal output) -// t.c_cc[VMIN] = 1; // Set the minimum number of characters to read (1 char) -// t.c_cc[VTIME] = 0; // Disable timeout -// tcsetattr(STDIN_FILENO, TCSANOW, &t); // Apply the new settings -// } - -// void restore_buffering() { -// struct termios t; -// tcgetattr(STDIN_FILENO, &t); // Get the terminal settings -// t.c_lflag |= ICANON; // Enable canonical mode (buffering) -// t.c_lflag |= ECHO; // Enable echo -// tcsetattr(STDIN_FILENO, TCSANOW, &t); // Apply the restored settings -// } - // Returns info about current cursor position in console std::string get_cursor_position() { int x, y; - // // Disable buffering - // disable_buffering(); - - // printf("\033[6n"); // Request cursor position - // scanf("\033[%d;%dR", &x, &y); // Read cursor position - - // // Print the cursor position - // printf("Cursor position: (%d, %d)\n", x, y); - - // // Restore the terminal settings - // restore_buffering(); - getyx(stdscr, y, x); return "Cursor position: y: " + std::to_string(y) + " x: " + std::to_string(x) + "\n"; @@ -172,14 +142,6 @@ std::string get_vmem() { return "Virtual memory of the proccess: " + std::to_string(100.0 * not_free_mem/total_mem) + "%\n"; } -// Returns message to send according to the server type -std::string get_sysinfo() { - if (SERVER_TYPE == "server1") { - return '\t' + get_last_error() + "\t\t\t" + get_cursor_position(); - } - return '\t' + get_mem_percent() + "\t\t\t" + get_vmem(); // TODO: vmem -} - // Writes log message on screen and passes it to the logging pipe void log(std::string msg) { // Add log message to the screen buffer @@ -211,12 +173,14 @@ void log(std::string msg) { // Returns file descriptor for server socket int start_socket() { + int option = 1; int server_socket = socket(AF_INET, SOCK_STREAM, 0); + setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)); + sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_port = htons(PORT); server_address.sin_addr.s_addr = INADDR_ANY; - bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)); if (errno == 98) { @@ -240,19 +204,22 @@ void* handle_connection(void* arg) { int client_socket = *(int*)arg; delete (int*)arg; - std::string info = ""; + std::string info1 = ""; + std::string info2 = ""; log("New thread created for socket " + std::to_string(client_socket) + '\0'); while (true) { // Recieve message from client - char buffer[5]; + char buffer[128]; ssize_t bytes_recieved = recv(client_socket, buffer, sizeof(buffer), 0); - + // If connection closed if (bytes_recieved == 0) { log("Connection with client " + std::to_string(client_socket) + " closed"); + pthread_mutex_lock(&conn_mutex); active_connections--; + pthread_mutex_unlock(&conn_mutex); break; } @@ -263,22 +230,57 @@ void* handle_connection(void* arg) { log("Got new message from client " + std::to_string(client_socket) + '\0'); - std::string new_info = get_sysinfo(); + std::string new_info, req = std::string(buffer); + log(req); - if (info != new_info) { - info = new_info; - time_t now = time(0); - struct tm tstruct; - tstruct = *localtime(&now); - char timestamp[32]; - std::strftime(timestamp, 32, "%Y/%m/%d %H:%M:%S ", &tstruct); - std::string msg = timestamp + info; - send(client_socket, msg.c_str(), strlen(msg.c_str()) + 1, 0); - log("Sent new info to client\0"); - handndled_requests++; - } else { - log("Actual info already on client\0"); + if (SERVER_TYPE == "server1") { + if (req == "last_error") { + new_info = get_last_error(); + if (new_info == info1) { + log("Actual info already on client\0"); + continue; + } + info1 = new_info; + } else if (req == "cursor_position") { + new_info = get_cursor_position(); + if (new_info == info2) { + log("Actual info already on client\0"); + continue; + } + info2 = new_info; + } else { + new_info = "Invalid request. Available options: last_error, cursor_position"; + } } + + if (SERVER_TYPE == "server2") { + if (req == "mem") { + new_info = get_mem_percent(); + if (new_info == info1) { + log("Actual info already on client\0"); + continue; + } + info1 = new_info; + } else if (req == "vmem") { + new_info = get_vmem(); + if (new_info == info2) { + log("Actual info already on client\0"); + continue; + } + info2 = new_info; + } else { + new_info = "Invalid request. Available options: mem, vmem"; + } + } + + time_t now = time(0); + struct tm tstruct; + tstruct = *localtime(&now); + char timestamp[32]; + std::strftime(timestamp, 32, "%Y/%m/%d %H:%M:%S ", &tstruct); + std::string msg = timestamp + new_info; + send(client_socket, msg.c_str(), strlen(msg.c_str()) + 1, 0); + log("Sent new info to client\0"); } close(client_socket); @@ -296,8 +298,8 @@ void* draw(void* arg) { // Print configuration printw( - "LOG_FIFO_NAME=%s\nSERVER_TYPE=%s\nPORT=%i\nMAX_CONNECTIONS=%i\nCMD_LOG_BUFFER=%i\nCMD_REFRESH_TIME=%i\n\n", - LOG_FIFO_NAME.c_str(), SERVER_TYPE.c_str(), PORT, MAX_CONNECTIONS, CMD_LOG_BUFFER, CMD_REFRESH_TIME + "LOG_FIFO_NAME=%s\nSERVER_TYPE=%s\nPORT=%i\nCMD_LOG_BUFFER=%i\nCMD_REFRESH_TIME=%i\n\n", + LOG_FIFO_NAME.c_str(), SERVER_TYPE.c_str(), PORT, CMD_LOG_BUFFER, CMD_REFRESH_TIME ); if (is_log_ok) { @@ -307,7 +309,7 @@ void* draw(void* arg) { } // Print statistics - printw("Active connections: %i\nHandled messages: %i\n", active_connections, handndled_requests); + printw("Active connections: %i\n", active_connections); // Print logs for (int i = CMD_LOG_BUFFER-1; i >= 0; i--) { @@ -353,6 +355,12 @@ int main() { int server_socket = start_socket(); + if (server_socket == -1) { + getch(); + endwin(); + return 3; + } + log("Socket created\0"); // Create thread to read commands @@ -372,7 +380,9 @@ int main() { continue; } + pthread_mutex_lock(&conn_mutex); active_connections++; + pthread_mutex_unlock(&conn_mutex); // Create thread for each connection int* client_socket_copy = new int(client_socket);