From 331365b0c766ac7ea11745cc96aeb716466d140b Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Fri, 22 Apr 2022 15:46:25 +0800 Subject: [PATCH] add templates for tcp client/server --- windows/templates/mysql.ico | Bin 0 -> 4286 bytes windows/templates/mysql.template | 4 +- windows/templates/sqlite.template | 4 +- windows/templates/tcpclient.ico | Bin 0 -> 9662 bytes windows/templates/tcpclient.template | 20 +++++++ windows/templates/tcpclient_c.txt | 65 ++++++++++++++++++++++ windows/templates/tcpserver.ico | Bin 0 -> 67646 bytes windows/templates/tcpserver.template | 20 +++++++ windows/templates/tcpserver_c.txt | 78 +++++++++++++++++++++++++++ 9 files changed, 187 insertions(+), 4 deletions(-) create mode 100644 windows/templates/mysql.ico create mode 100644 windows/templates/tcpclient.ico create mode 100644 windows/templates/tcpclient.template create mode 100644 windows/templates/tcpclient_c.txt create mode 100644 windows/templates/tcpserver.ico create mode 100644 windows/templates/tcpserver.template create mode 100644 windows/templates/tcpserver_c.txt diff --git a/windows/templates/mysql.ico b/windows/templates/mysql.ico new file mode 100644 index 0000000000000000000000000000000000000000..b78e8166b4ef9c42975933ebddcb02e644ca16a3 GIT binary patch literal 4286 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 v`S8~JAAC;hxqy@6 +#include + +#include +#define PORT 8888 +#define SERVER_IP "127.0.0.1" +#define BUFFER_SIZE 4196 + +const char* kExitFlag = "exit"; + +int main() { + // 初始化socket dll。 + WORD winsock_version = MAKEWORD(2,2); + WSADATA wsa_data; + if (WSAStartup(winsock_version, &wsa_data) != 0) { + printf("Failed to init socket!\n"); + return 1; + } + + SOCKET client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (client_socket == INVALID_SOCKET) { + printf("Failed to create server socket!\n"); + return 2; + } + + sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(PORT); + server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP); + if (connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { + printf("Failed to connect server: %ld !\n", GetLastError()); + return 3; + } + + char recv_data[BUFFER_SIZE+1]; + + while (true) { + char data[BUFFER_SIZE+1]; + printf("Input data: "); + scanf("%s",data); + if (send(client_socket, data, strlen(data), 0) < 0) { + printf("Failed to send data!\n"); + break; + } + + int ret = recv(client_socket, recv_data, BUFFER_SIZE, 0); + if (ret < 0) { + printf("Failed to receive data!\n"); + break; + } + recv_data[ret]=0; // correctly ends received string + + printf("Receive data from server: \"%s\"\n",recv_data); + + if (data == kExitFlag) { + printf("Exit!\n"); + break; + } + } + + closesocket(client_socket); + WSACleanup(); + + return 0; +} \ No newline at end of file diff --git a/windows/templates/tcpserver.ico b/windows/templates/tcpserver.ico new file mode 100644 index 0000000000000000000000000000000000000000..b21a8bbe184a2b1948475fa2f659c704a15fcb62 GIT binary patch literal 67646 zcmeI*2e@8UnfCD@LP#J9MVhowq^Y2Q1AZta2vVd(njjqk#exkL5lBx?P7(ryDxjbg z5!=|?SZ365Mjgx8jtxY|HjIwr<=9}&^V{S;vvV#oB)|xtbK>>5>fU?p^}nBIt-as( zJ&YN%O8sxzv@!MnlgDho#wuer7&B(f_GMM2va6SsTX)Sdo!wU+{r}M!7@dL985o^` z(HR(>fzcTloq^FA7@dL985o^`(HR(>fzcW8_F&Zh0_I?4q&$-OW9s18s+AwLNB(^%<*5j&vd|ACc z9<$a`n^5VfJ$mLKTrk3FjWT|U;qr7)O~dga>}kg_j(47kWowtMTlToJ^~-$3u;EhM zsM1k;=AQ_7xE_E%*)m2FeTcf|$qV0_s~4bTEjU{5FF2kkteY}c|WPkPdm zZaMPEBfoakQAd4q>eQ*j14HxY&mUU2aN*G6#fyh7yX>-|%P+rt=&Gx(8oK71Ylg1B z{`#TouDfpNh8u1eddpkhGIY~THx1o#%Pm81d)wQFZoBQap?ALXot?ewUGExV?|tuk zhwTF&_`uKyKls7UKJ=jv4UM!9fB3`0ZRwli|N5{0x;tOa>pHjJetUP#TW`I!8^et^ z-Z;cE#y7t4jYC&ndF9X*S6nf)WXY25eikiSG_+{Jf}z2A^S(1MYxZ~M&z$w$foU_o zJO9Gz-y1mZ4d0vp+Sh-7@YU!2V8P4Jz2oASpL^%xvtRMU%gUCV^|HGzKjWo8T5`&Z zeso3Il9SH-@nt8T@#9O5KkY}0k3a3M!DCLkYu+&@{cy&S&%a~l@u%GJ+NsBUWA81t zzOvXovux)wF=68}>v%MfJ%N-a_`P^fFXG8F)?a`9S%)8f_}#}Je|&rPv!C7e-+%vQ z?0^Ff=*kBkcwpBqJ^0{*hwYF<4r$MM&U4zKhaNg?b-u<*NA0=KeeST8rdnyLvty1q zrX73iv7ME^8Z!n~T5Bhsc;c{??z;TRC!gF(d!3zn>Z$Ft(@tB)PCxzh#`^Um%l$Ta z=W{OSb{%Q|+VaM9!U-pIsc{;2`9*UNxu5c#c4Xb_QDsLz_sDki5mVc-hab_NfB4jP z!l8$^Qx83&opI>Y_M$_MXy+UmH#~W8KT#K!{?z)Ywv(7rh>Dp_r-Poi_ zlRBF?abjDZO_(sDJ&>)n)>>_Ow&t2^wwON2KV0d^>rSX^Oe$MXrrWo{?RIMy z@9o*Np*R2JZi~D?E+_y$-Rkla@`7h2t|NO>(x7uo}j`I#X?9j27hWkbv zZPYRD^9@rRu?r*fI)424Hg4Rww#FK3w6SByw$)Z!tv&X!j~%vES6#KS$2{gSZIxA4 zX*HI=7^{s|tA)0$K4z6RzHH){$F#?lJ$}rpZL2YlZ99%xt?fEy_4dp$W7~ma)@VnK z8P`r3vu2xFY_FPfc)Nbe5$(pZo2E?tZ`<#=?dC&{Yd23lxxIPnNp0bt&u%YWe{ws0 z!^!Q0O}1`RH=f+i+~{`ki~zC{OoeZBS88}?^@91Vnj zUjwVJzWT5R!u~Ire=W3a>{9-div9X!n->3VivN>~|L(Hj{Dww@7=`yr#|(mod&kta?9oNPn>@s z{(b)+$)DfH{?h!v9ZuUQ&cyV!3~wpsCiLh;|J`0r8t_bdK~m+zlY{9iO?t@iot z*KO^bC$@I+vs%05#MVA>Zfl>KTej%FR9XG3ecBgx-l(0u%7pgf;(z*P+qM(7+Myl0 z{Z8#!n@n!6Ir;Q9%LT3{Zlq=UtMov$N%KVPHZpOe7kny);qT2pR`Lmc&qK&)ZO-Iryu^@w$|!nk1Wpi z0p1N@@BN-;p#f7yI$=`@a2L_Hfqz?1TF3`|E%90Ezp5ss3;M z@B9CX#{XB2nXtm~U*EGs}Jh9_{(lhpL&)I30cFu{Xw2dcDy0AD~ z1H7}f@5A5ozURclJmZ{s=9!%a_T6{i&j0U^|E8O6+OfCx+yC)>vH$+~XYKFD{*n8? zK7X-)5_S+(BJS!(j?wCSVosm1@; z)h4zh#;@CsEB?nmdDnK*Ui-DfcHOdCvb6ZV?Y4*RR8x04T>+BTlF_M)Y%F~^?S`!B=ayNkW{+N;|KPM$n@c;DyQK6`#~ ze|c-Z*dM_P%+?$+6Nw28t@$G zS%81Ptn8enCa+GLKKf2wWqdoh_&=-oAGX!@?TF(4yl3v)4%=hTcHBXSw6({Le_62> z>%(9C$6wvy_I)pT$xE8&0QpzE;uUSytXXYvaIkqUT(Drlu+@9ocF84|w0cL|>RoNS z_~MJ()mLBL>RoNC_n)oa)wVak`OWQ3Z+cU!cebtG*LL>Sx4yNpx4-@EoxS_r?{4pS z$2*#|-mSKJ7u(+d{`YtG(T{$#{mtL}O;`8vkAJ)=fBMs(ZlC<*C%g1hpZZk$#3w${ zKKHrLb@umv|M%@5{^1|GHg#Y8;upKJ{1?9Ph4zpC_>Y}^{_~&j+EV8jZOUKz(wDl_ zG5Y1)pZ)A-TkP-t?(Z6N?T>xzW8JvqGgkNTk&k?&yN7yz+}`t^_q6xa{k`iQ?`-e9 z{T=P?x7^xpzvXT1-EXToxbdd;?wf9H@4Dfp_MSK2)ZTx?E$w~RzNLNejb&H7seSnJ z>)S_`T;D!=*>&yXOWxEza`83oW0zjnJ~Vhm`@rDk?E?$1Z10(WS$k*M+XpXeH_V*h zuD))C5x z*DiYf`E7dHtn)8ubIJx@e?ePx!Sr_Ng)`cf(`L7;-Y}!RY1-U&!-aF&&C}+!Tc-`Q zw@;tnZl6BbZo6P^yM5Yy`CHyFyWM)xymrgmd;Ffy>rV^Oi@1>3;23R=Ve&MhT}oShqbs^eKf0nPDHDV0Goz-TdYV#p z4AVy{UWsLW?L~u*k=L)E=3KNHt!h`M(RuUcb^X;j_sp3yhwHSt7VQpHzFw}i`E%#B zf!URoT|94oyQJ*0d4uh$!A0%Lxr6QM+4I|Va|YWD^A@$Y&Rx`QnRjt}+rTC5wt0)& zZF3g2TW1cox6NA6-nn2&yS@Bf+f8#8c71OgxVT+g$6qsdLA!QA&Bs99&&)aP(t*LY z(+)d+w^%=`%sYP1{GR{v{J%r(^IwOfSQXBR+2T0XxN4(`#0LDr7FYH9r`<8i*lADf zz)C#9S-rI17QTHQsKXH3K6}j4A0u8Bk}X-rvM!nGftFlG9QRoa|K zUHaiIc1fcV>^m#&gYyR3;=x)==ge&jX3c4f=MJ>X=FV?d(80U~?egif+toAYwd-ch zZ#U9G*-fQ`TLu<)c2nu%Ewcu@x*O*#=zRW~>2upv)919SW)HM0$}X?-Ij3_kS$MH{ zcu(!m#eeU5JpX$K%)I;Gw$}Z->$A_!=Wo9G=FX>aqlv@-c{;#0dca>9=lH)AQ+4{` ztjv^Yfo7!mMhoiX)nTXIu?%yJ`#w$!(FC3;(?Njh~j5bi*69X2{uWQb!I5Bf}TT=eIgbwD+Z&wz>t16CP zSH671;No_DalW=<`;GG#x9gJ59_(U;KG)7$*siYl;n>UOlm;rEEEz06DE@Tjz79I* zpm*0h7w><32H@SlcYyL+*WBN04~D(CU!SRWev23W{2osl&?nl!K5gov2Wh|TJh(a+ zeK<~vxl|iI(!>gRZPA1>!;?O;$B@StclW6sfAy@dk;D#t^o?Ol1Ip2YzS!d#zt_*T z)Ta&qv?mT|qX+&k?KB}q&`Q-=2L>4}%$(J6T3E5*vWnG@U(@#gQ=4)Oky+4I`POJj=lWw7GSyfSlB`8IDs|($~ZGx(1+=dvHBd#$8n|y%%lwC z!~yN;hpDo@Sh8@A4wTa`@gX{i4iX=fu@Bq$d$bVWPZ?j=iEfmm1AXWK_xgTI=lh8X z^GZwitpl^WbpRW&fDXh0>%k?ZfkhY=%S+3b#e_>|&25)eIcBZk=a*L9lFDDK-Ep($ zwoB&M{-iXuXrT7hbzavr&f1&Y^R%Zu?S;kLbHC63n9u$x2F zQ;&HpaX&f;SK3IMI*jp_XLv_5$!m`m#Q$gjfBV4!ai#byC{7G3`@)447Z!=zSc(Tr z_le@U^}N0})TM(n?u#3PwRQ|tzB^{=ITkNi*y&505rd4)J=A-h!QyS-zxq;>-w1yk zv1hm^9^juf0sHv9et0W8R*EgHu&|a_PYX<59Eg6Ro5Tml;T|ny9Z+V<;Z7UM@%3=U zFTStcz0(9!PM#)`m+Hr`b1r#0!Pp$qK-$A!9p=i~aE=z#$xFjuU+chNX^0l)(T25R zMm;+e|EvuQOA`xguXstZl-e`W2fwcGkacz9hO)J!^L6djZ+7{A&g+?k4vk})y*?8}9P>M;ClwUWz%sQbrH@N@*e~#>#wJiZ9-dO`J$9 zP){RtfN%P$$6tyecF~D?yri@dUr)d20iV8BFjr12h+9cz}O2ka!U8QtZSCeZpTI zzD%7o>w&!XFvkvO?bypp@x?u9>M_L=S_@z6JGfqIOwiY}DX7gsuvYR8yf zoJT(z(C&Clm6OL&9ri3`bxhfLJD;y|;)FJNdT<;@$!k+~ES58C4?z>NtByXTO#Hx^ zejJ-~I6m(ooEv-Nt!Kc0ukUm0R=n-|>LaPny6=G19RCJ?EX4pR|Hjw5T6#zx*Te$4 z2y=BzyBHvi|LY?k{@5yGE6>*%{_1HW<$hcUdz=y*r1+#iu3`X_5A(zYTw~hQV;bIg zv1kAX{gi2=->%NF`ozq&yte2$uO=_o6%Qcw=on@NQnJPKr0i^dZGrUOiLpuMhI63wvzk z#eEu)rvu!hiRdEnz%e)}_uJ?JS#e3w`f2e z!%dnvko7_t>*xYceWmKKq6elguIjbB4#xfXpg)fBZ|%4%>zA^+}Jc!>b z(?E0}O&jhkWek<+BL0s*ji~Eufj0EVkRIgY^LQq&J${d&viYYOTpg<}EcH5siT81kN?vM|Bnu&;Y|nn(=rXy z_Gdoxna+IH>$6>-`!e-DzxBDTJrHf?Jn{ATyK}m_~RMBR?a&nslM81Ldu-GK7;&Tz5DffPuBkMr-jw)yIT`#j_dXv0~`^pRr7%&Yb=msg*40b}`S0AG2>g+Hc=4PpW2>E~L;kEhS_ zeILMg258uM_&Rpxu^(Hp(58=jq7|R}_m8JD{aERM zUVrV%8Jm7-*C+MZMiV{{SFcV=H!SSwLu{+xPF-J|z3&ffRF z_YLbnIcou~%6z}iUVZAM{9K(r;jf%npf38L32dVcDdze_7g;l+0rke@J0ZU7;rk%Y zM-%Sb=k&fOP`@?ote$_m&-VSk#diUi&*+&t{e51~e8+%^BgX6+^iaPe>@0mQP80fwW%b_Y%wnJCe#}SmA6MUF zILjRJ0iOk$OC0&OxQMxUAaC9i52Toey|QD>n>0oT&WR&GSC&s%e@vC51wP553%>3+ z@fvgAzi}?}gfHG$=KCSo%xzdpvxmeo zeorF|HyV&?)1T2p;Qq~>~IEEGy+vJ_s`Kr%7_1mqji+O+VSH$E# zjMO;~AGCh!Yc4RMb0!w1jH5FCQe{R9(SuYw&iMLn5BBo((S2`cX^fE9FIvFGy;^JN z!TNwb&e)3w;zE2HPi<1{5(hAHA4#JV+|=RdTJloNnPc=xJO0>5C;CK3b>F|N&;EVR z)8G5uNB_P!U=J|1ez&L=j~Dv5PyNDFU6@M~1EeWCMof@0&pM}{e)@-s zZ{GQ5?>~}%_a3O$&QI9?gnPcnC>G$Q%+F~fYl5==@qP93>cbl6@YaTTv>-3$=ea;V z=8hHT?d9meTqNGv>*7rV@d0&AEUdY+p-=_QBy6?OC zO}gK2`|UTjG~)Ptw=Z$RT0sX{GiX5{alty3J&0J4wE$o2@RjdB7tl)D-Cz3Yi(lCC z_wbh2H~rP8uR2;{>YV?u!w#EPu>0?Qto`{XpFN=WK(p+99OcXQ!>u*KRv;zJAkA8&q*1>U~D?r#rB{hq~lH2J^2 z`pNSb^XPo)7>+ce9b>bD&G6yyHde}DYDJwVOh{`mVYGhfHubFugz z4ajF7NC)b1ci&Pv!5c%SK5Is_kTyOqubvi|XAsZl{K-A$Ufg%?Uy3^pnDb%0&pGFu zPAB4?=K$xhj!5|(4Ol1b>peeWWKU`Rwzrcy2Q4{=xMb}YE1VyHZ47f7=*I+c!Wx0E zJ)&!4=h`u>qlG*-gf*7YhJKhk9#?5}qHJ!oC(S%1R_I%L{LiKD{O@n=@5g{{53uK+ zdu~|Ve}@6C)&hBZLd>NYYYSUt8o@d7BJn^f24tT=8(2Fg+-XHwU*D^@mYOSb;hx+F zUssO*n|FTccM5#d{Na~9gH$X@oqdBo)(ml^|1Qz`tzCb5)DK57MjKzY&of4G!nMPB z)R?We;aWHn4Sdg-{pD9b}0#|vd`^B3c`f(t6sdl`r^N9u4dAf3s z?#I2D5BKBVu{Wpw9*e)bA|GzzMxG-vWY}xx-%|6IHGpr63F)Jq@4FZCo^^r-u-4!8 zw+I)hIB9S&&D*_X+o;{XM|=n)hoxWASxn>@4}je5~-6nm7FQ!(G{ZYiIIwfxYA9 z`{s8y^pN|;o@I_w@Aru~bR||=H`LLE<7j}N>tj8@oVgC; z<6?&2#`yb1{x*ug|Ks-{_7?UU_KjF49#{jikC4)uIBE>xpEysK(SX!FGyJqAHmEax zW$dMRMu&&!eD4$PNyFbBz#i~a{*PsR-`G7Ds*~ay?l@wPJB`R= z+>Zy*gcN6*pap%fm**SIedeCs8&jrf>~O}N&*Lcd3?Wr7FV!Z^T43(^zu1{N?CHR< z;=FmqUO(LA#R7iM=jDx2tgyeZkHCyJ=)!O4>A+r4Dh@;!`kP1nnepH&wn*`IpZF=8 z2WjRY^Po?3lo%kzpG6zh|4;R|TP7D%Yd^OAeP0!q`KL{vv8D0J^&7iCd6tRa8@G6m zIc6+cNSwe_9c|zrJtVKJk8=2n`St_u%{;iT%!~UlcQkJv_*B?uzbNIy@%21Q>Ze{D zkg7Lt{F#o_M>jNXzp0;g>~UwfGkh_(Z@`>pq}fMG^|ueL?^$&G`)h%*D?8rY<-H*- z<-Wt*IKx<-`Jja`H&^CHN=MO1_&b)CDrVhXzs2=k-~MMl%RuiH@V5tCy?)z0sp9qB zc@8i?7}Eg5Se-Z!9nb}R=!bvu%D5{t{k7w7jj=9>Q|`^Zm=9(5X3oX2%!e3^YxWJ; z+duH}yf4r$uTNq@G~t}iCr0A$+CKj?9-2_^na?vL4R}s)O+GJgjbIq^WhQe}Is6;q}QbI^|w&Z(?Vd_x^g&_OiP^ZRZNYpr~5@wE1@6o1Fm z{k#t!&oF*(D>mj?K)D|m)MHB<@(g#Z>0)GFUweG@{049L>^`LKvHp%^7YFG?o%cEB z7xQq(+S(I6SVJ(^&bOI9_#2ZHW9M;S^zGc%1F_z-1or*kKx0P(G>mm(ez=PR*sG@l z=KS_4_6GI?nA1Vt9g73_8*6xDk8kEc+Sh>g@HIc!Gn$U+PZ#e?^XH4r=8d0Atq1%*zOOEM?D5oBe3#-Z-`4=1wBvcoz2ooR%$ro5b=EyO z-W<^fAH)}HX8w}Ln1y{}fig2r<1@dRH@cA*@9o_@PlyfKI~otIc())HIM%(`$7xIa zm(l{0H-2-kkM{`9&-byX1?*|TT47$?KfTZ)bDdax-n`I5v|)dsFV^~oyE#*r_WHih z(~I!(-uo;AzY5{sy$32E*welYC%$41!#lA6W6V?E*Mj+u4iYPr#aeMi{54PRot|^= z=G*<^>m2Hp`KUVQpdr5O8B!gK2Kc@$6U(#all%Dljnu33;b4p+Q6PZr0RW+ zBbH{)+-rQs^OXC|^8|kU12gj-)-;fHfClgl=dAtOvo1KNbMOz``AGHwd@6dupa0{Y zIKZ#1MR=K8_myWy{QFvPPYi$S0sf8?KfEKzzA_r14fo~x;cGtdGv=_29+c&^>934= zbl_gxqxr0N6kjU15A@z=dHlQ2f@)5`oHZbO0P8lM=7In7d2Q0Z|BG#Op&#zifWGDz z*ThNpWN!E+wshloEZvLu8d&1Y=qK-&#FMaBA6@8g{Wrhn2y^qp=lKjh&;ozPI_n1( zj-v&svAVu}p*^7feAansBQYTN;=X7?*>$mIo(nw}xKFVFd-|}iaZi|=2f9gKSzcVg z99yY6_rlB%9k{>52IHzVbaBCbp!Yua$3LG1jjwYqwg&Kd+~fP!1Tg^9KKtk*_3?kl z(tuckk2z)Lkgw3PHBle@v1jJi9Jn|2Ec~U}`$YrFv_KnTwY)JnKE5wiHdo%`83U%_ zPII`YOdHzqwuJQ-J|(&Exg4V<1&ssQ__Wa;2DEn-LLCl8^c^o2;b;J zd;FhXXh5pI`uwr}UhifFbw%F$gnd#P$a|p8>KW;e{MPqw_Hm;3#fBGTE`oIalkeCJl$cRI6x2l*md!bVV#&D z@0y7N%9xv@_`h?|O6^sDQGa{S-*#G&=l*a{ihuVWsQ#|s#G3bC*aKiq1N@1(cfKvf z++6D;k2gK&heKk3Ipi-=8W1DR2e$f$JspUz?w!Ul)kYIp2c*%1c6sfzAWy62!kpN@ znK#$N!#U&g{GS<9_KY~FGY0IHwbO@qZ7pyfK5kC5>7%T_^BAvZhH%FoXYUwj5qs|i z+&}-P2glJ&Skpc&mVXByrzd@e%ty9Q46l4A4(19%e4+16x|+_xeb2mzryOh<-d@ z(ihIyn;W`dVuAS*d&GNa31fD-K+bQ@)y_ljDa&9 zVDFufcqi|9K#IS8APtBi_~Fe@quip=peeFQ+cWLV~HWQ&gI(9&*)2> z@b`2*H&`z)7B}2CpY}Zg+E5?<^y0eO@x)bsTEah^X+(RNyH{rXLN&Kg|^lFl$QUyu7jTUv>D?M&bmmiVKMc z`p~H732{tZw;ss5J|ESN3BRUA?A((*f_nQvx?$K`5A+Ft=ji9LW_-eV+)LIAd2zLL z|G9#=vhRJuJ!$xN?}6%`KW7hsdE!3i*kUdoL<`!Z4KYC`8@TUjd%rl+ngFB{tTt9hz`<%mFfBD2R zW55D$+%cvrI&j~7f(B?qyKy_-F*G1HU@v|+hd5zv!d4#|F$Wkchc~}Bf6DaWUc@|e zR_}cV3*v)a`}_Q}2OL+vI^aD3*7gEo0nYY0bRfmL&s{xDu=tWWr2+S4zReHAUMg;c zuRi9EUidZ*#Q){ZrQPSK?#meUah!HW3)T)CX_=p3Z!TDvC$CH^G@wr3T6YdF zh!1w{AIZPl1Jqh|=(oQ0t&Ts|;T#QM&;P^$8o^vj1MxZYiof}zSN>rx5+mgCbS$=X zudg}e-t~_b^3H)zedQ}(>BjDyG(rPn0#nA^*wy2% z-gS*L?+`uD`5Z~=GYsDgwC^((CMM7vZ$>S_8WIZr`F+gg4Ev?;E|LukRZ8z_5FnqB8hW7yVxBSL1;hAM@9>veZ0D3TQG$3!TaA#Quj8hDBET7k39$V$C0W@y@XotV!P8%30#}A#Gp3EKH z#OLMpr3cK_JGU{>p*b_JxYK}VLM)5{cYPfj?c%^3$M^BidsoNG+Y2~Xd=_KeeFoqd zhQH@V-x2dJ*)xDOLLV9y2b?Et-CJJ=#$fG8OmHnGPStmkUtG){>fSFp=<^>}V>|16 z-}~Nhoa7gY1vDT}7m1_V&9(Vs{GRbgags*j!{(ds(}5HN_a_EB7HfT@0quAyn;-LL zPH0JAzOT)B#VI~%?BDs$ce-(!PptVL6E~FY2{FQeuliny&!+6@_$cOB<7SPo_iSC7 z-vRh~GfA1HT4>slh-5#($yWYO`fcJduYhUYPAxKlaMlVTEJj zfb(FSxPhx!;TW3W&wP^aJC3%j<+$^G=W|_g7iY1`8ta_=Sj;hJe9N54)0jEr)65#{ z^I6{k^sY|cds#6;fBNv9KAiN;n(Tc1UOPX=)!Hu~_Kv|{?58p7ntK(a)O!v{tia#> zGuM?y1ID|QcXxgFU=Hfq|6cz+E`Qhgp}hAQsgvvh#@2uTcb#JOEAwievF7)Diw?}S z`^kDB#Z;{2lQ=T#FoyhJyOai^gJ?ou_sst>bWF^-UC-X!+!zc0c749@n(8s-PxfN= z<-X_VoviO(#OKYQeSmqz2pj7Ky)t>{*N@J`Z_E%Wa-1oZ? zvEO??ZFH$E`k);;pbz?&(tx!vdN7v0e#QP8*QX2KLw)bFJpSE#pt|Re<8A)Kz?{=V zd@s6C#>m*rSNtD;zN{bq{Mb40SMKit#Y)F#O^9a18oJPy=P7fAqdCV~4EB8+{wtp2 zt-tFhwr9OIpG-dt#TEUmQ^w~SV!3w<>Y@#OvaYE!CgvPsgK^Lk&YlnXxG~^Mi#|V~ zjrhIsSj)r%K8-o!2iQjg+SG{y#_f6)uVxjzhimPR4wl&ilt0b*{`bG%vB#GN_&%0d z7u2P!4=()QoYH|g6UQBAZpCe>W0F_q^X7^_(Z`*4-r4!M_+zg5h568jFZj-IzN1Aq z;)ht^JoF~-x-mSh)#8EpKp)1L{i4)()QKa0W9nM2jXBQIfqd%tzI$|iy1`xya(+LP99Yo$Yd>}m^_M*{9)&acTFLU1P3$&O0zTW%fZ~I~OaIlYdoU8jz@Bs%LuwgO&-M7E}?Jl;{ zK(v5o-VdpdF3gd+F{k{(+$H{pdAQS$`OkhY^C_hxW}ax?eDDv?UFMLl=KT@=VXsbG zG(ZoouReA3;9b0Zobeftao{K>YfD^EhkY~<-qAwtQJFTe#FUQR2jc6iz@^AZv-$PBqfA#t;*;+NP-^|{cf71f)-~8q` zyOmDg8+tQ-*KiMsWf_|~ZHf7`Zk+0kRcsPlj2Wv~v>@j6 z9?p_hd}ruFlvzr`y|$*Up_j^6rTy^x^kngy&5D zug!h4@OO@ALP`t#-#P0Y^cls*-cRiJ%>Ho4|GWnnSF!5U>;d>be&O!fz&tABC_ZTC zTjn1Nsd?8Y8o*2pa9-y$*XG~*7vHlHLvb({7@HS!MK6w{GmPj!%74X^_;L0C@qfJ4 z8IL-7b>=rSY>streBGE5Bedh@I84O@rmuS3m1%&Ev1gtW_zK4E zSG&CNq|Wi!ivike+`p{fYcKC_`#oGD7~TWaZ^|Z>-`>qvy=TLp&+`3f0aN}>4~&0$ z{=p&sgID$r))QLbBc741hw*KG>|ExS@eBUwT#mQiI9ETG;Osbh33G7*bFl|U8i^Kg z^xgpf#94kXZ|%Y{F#>nzz}$F}VvD=6(U)WSzx}B;%#&hh9x&9$`DxrcL%xr-KDc8| z3)1MpamHu9D!%+rf7|b2=U*orU-$Ap{u<^|z8?R_C40nZzDqakZOPUg;Y zxcN>jk>ZA7VlY4BJLc0dH2C8m|G3?C*InH^0;%#3fB3`BzWd$pcJB?0!}$^?oHP3X zV=|}S?TNEufp;+09rcbgUaX@%8jz3A$G?q9KgZgy;HZvnrTV!CbKpIN_|G@&0mQw; zeSPp%&Ynj~3-m!Ju3c;7v|{pbzxNrboBkefT#flWbDa0=*z-f>ejQzi(R`Dy_4fhh zoL}QW*WSsxudD}-b52?^Z~QJAz~0=LOR2dsANEAfl{t^E(-7{)Ce|>zFg|g{Sd7nn z;>`~|^VxsUqk7{o2K^Gp9H)*M8*@!#vVPdhMIW@UzJCvNX8(u3Yr1x{o%oNx`^_5Q z{?xfg_g(Kf_bFKYwI8d8`(OCm1FTW+f%Y_qVVyO=93>9OCoX8mlGd^8ufOgCdp;At z=d1kpU;gD^x;4d|I?f!LYx&HhxM`2*-5>M&ai8CK|Eu2TcfP0Ly}DRzjxz?=>AzQW zZaTsMXLIfyo!I4i?#UR8M_(y3cAC(K&g>bi>)7h=eBr9EKH6gTf7YM$F$QdDfGJ}h z?$Jcu%kS!U+WuS459en-%hL`Gbnk)o+i$=1Yc76k?!<4g9%CuLN}fKqNLwu!2<8poH!qR(so%j@HsG#8y3hj#0~>(Gg3OKZQF=(8e> z^~2kJ$}@SExJDP^r1MqW_`1K>S6m*<@4S}Bd3p8W-+dNT_xz=w{p@F*k7I5v$3K1_ zO(^&EV9hg6c=0i@SuD|y&(n-Hz9%l&6YvkI`{rlNobzXMOgGslNbNWCe8JbE3+L5t z{_VNwLCnCGmRysWYn+@HV~oTRT5(-*O==w4<(YHS4_%3Mt`p6=XJggJ+TfhVV4tDC z>u0UNIQ)$zW!lhBopV!se`Nm-Fu*#i^cfk%xCjF5biX=@3EKW`xn-C z&qU@9BTU4I>?h5qSj|7(F9wdGck87X86AXi_WsIvXV1|us}pCmGkNV|l6{(MnP+p$ z7wN#bXp^4o1AP8R1I9w9&f$3XAWzSHpRSCPCftwy;)3(Ij{69Ix)K+#XUXfA=LP3d zHa2-0!@s^evLb)mZzRVDTMqwj4^aEnqkr;~pLATYwGNn*=m39a4igs=8)#chHeZR| z7|NHXyZ7+8Gsol4_>wubUlK>mEj~En8?ES@I%#48My?|sND~|QAlE?*;8^+%w*o%1f;k&Zl19eJj&ve4xg3 z_XZnmu%dt4Z$5Hqma~v*snO}^3?&o-I413xNe`Wn?fd-g!smGqVrv7}_+%oleYx756uJw+vhHfzgS3p_%x9_6+Kci{6aET-CmJ zW&XC`194r^_N)Qj9-zi^n>7IQJV*7p%QG5~CXOa1m?LxOKCK1#h#StSkN$Yl1EYUF z;{MI4IdQx>GX}?ELo*C#DgO-j=pY(UHjczqbIo7XB{pdDKESnH(>09CzCjGLSK!k$ zps#CYO*AHbj9njb&v$-t%>GeI1BnIM2kOIIQ(TlrBlS7q%KUA=73KRt{rddJl~0`W zumAe59b5b{&VA#78NXMDr9ROL|28+~*t4&D&OQn&amBHYqXp;UPv!t0*P;P)FP4f4 z(OEQrF-v@)1H83I6Rst1UyU6<)ivL*t^;sWB+J>hdFKPFZTO<*IqyV>v~}t z?#kIS^w$Jqq8U06`zr4Kc8@*wSlPerx1x+6s9*K~V`~iSm4E(6d^L>wzD^JEd%VLO zcZMxq;;l6mgRBMCUm9?Jed)-a+#KL3Ca9wgy0BLh8=Q|t9~fhfrQ;aJOuZCK=Qh{I z;utA&oD_e3F~w0Fz+X(FA^pTR$Eu?N-0U61eEh^Pc; z_F(?D-ve=7(f0879%y`x{j>Psj6Yud-aI6aKTTkQWAvb`o;lw9*%SKg#606~&T&qR zF=w9ruyq|NP0@gTy5~n+=)$-hi-$CR&!3&&x&x=<-~yWQ%{!+|9Zx}q~`vA`!k>A=^<-?J>VL3 z@AH27%U^bE#a?{P1GY>Z-s%`##PntQ;V%}LbI;Gd2jzav86Cv8YQ5>^mEY;_-1wS* zWqV}rQ|+}d^E~1FSwCn%-gU6oN2;EGVQJp!N1e5XR$N~{8lVyH?Tmr-eO|0r=evZ~ zdTTzum|`c7JDs>U<>d8=Cgip8`{+U5c(z^|6Z)cj=$j%f5(I_!~q<#CL~rkMjvw< z!$_WA<8M!GAFYf96O-dh&gr_&Wi5%Xd)D^OR?K#caTzDgxdyh3e>)~Iz;m8CH(q0t z8V@G+@vf_mMscARI`AGp?+OyPu*cgm7%OYTU!EqS1J|TioYgr-UGzZz6?=YG?_T`Q zNBn)Lzwurk-v_E6jsaV4x#jqpzdNnZ<|ynF_pvwM;f$4h+WT$hR5|NJ_66p_{@&Vd zub;hGe=Z$!_uY37KR5PcfjD6AZC~yfed)kh=zwqAA0!@F1H8w@J7d8?+{X$(kkZisdrD>X`|ofI{LVVdS&CF0U9nX-&Sz)&iBt9`=g8Sr@z%} z4&L-{|MqX)e0q0-x%ri6G{O3@fL5|zU``KG+R#P|^5#E2$k)6(^WNMZQQ2H$%J?y! z&P$KK_{A@})L699j@a!P0~6=XIE~L3T#qg=z}Wn|P8i^;Y~SY{uaf=jbNOgM3{Z!azTz}C_Ud^jXRn2eIW>Rgi($d9qdUhtZ|0kSG5vBK zYYaxX#Ru&}#dqtu81Grm`fhE)MSrmwZ|4$E!WmzA>x_2SRyI~`uJ2gmHFotZ+_lSV ztK;vj_3Vi?_m9NBZ=}Y;f7N;~wt20;_wc3o5x&s^J!D@XuOG$?oAi@+oW5A$9up7L z@o&dvZNSDmdfyLVz7OKv8$Iw}^Uin8wK+D|nPX*b>dZ4;nd`)Qdk*LGe$o2jxxza@ zItWv~j(64${KMXP=_oNE^-@|e4t>I19WxGT>S@M#YmEO|{megq^$x%uo))~5 z^}A4i1J>_t<^3ku_kZN;9cuR*(EQB?ee~6yce&Pfdwp8M0Pipti||v9-={r(k7L@S z2VBElUSDNKhjgjV{m83x{#tWBvy^?-{YR2N9Sm!rH2p#Rk5D8B67~<=Ic!dHJ|L>ZM_--kO1r zSi{$)>h)39#^>dw%E@Eik4N;=pd~1$2@7;^urfhb+q8T zd|sX7nLeq*9E+5(RVT$#9>2ae^w*BBeEc7CdHv4>m_^&j3gP;HW=N)(Kq8oi3gO9#ptBj#kU9=SKq#n!YM1NfM z#a5~gUn!2!Lv#?{*r$ztv`Zbs&y&|5Z$6&9cHCmhi2+jeQr!7@;z4{rWorZN)PDBP z+J}n$kJ^7VU*GT^z}#b)&usWNj_S09Th@j!miCX)H|L7~W1N^E@0`kE@7(g(vh)u- zW#@DZei$dOoVsWLS9LVxd^oCezUW0A3wu5uErh>g^a45344Kr<0J}>Y1)Td2d)r>hz_B#C;kG)98doa92*e&zhjkc$0u*d+#pcgks#(u|lO1}KNKRJpGM+%Qg>SfNj@i!+|_clEeB zP8~)m^JRUNqXX>>v*g2Gf9J_LFk;&Ic{JcydHRvkf>fWZ0sR<}eAWaSt9KN4*7pUy z^Ly0)t9R#H7nA?^^{;>3@x91*P{!0YlC*j z)IRX1^%<*u-~TuN>fP-6_0H-O#pNEX&9!;QOUlAB?3C5hg?{Rpa`d8)vVPj6*yK2T zqaEkaCZ!9Ea!z@DqYvZL2V;4h!aII1Rp&S<_6+N=O+8JhODyQ~cOGn`0e!=sRqNh&3@lA`fqdwMrUAj21aLKbOuIeU~~pXXJB*&MrUAj21aLKbOuIeU~~pX zXJB*&MrUAj23BeY+9Uk$-epI7(XW;*Px|Dt+Ys+5$A(mHZ zZCd|?D_dT*wNLhsf2ifLt=-W--^!LJwYH2v9%^}u)|L^_%9i(TZ5hF=Z26+rmJ!JP tl$Q}itAEq}djbpRGJp!tG80_WyUc{ubUkpnHz8Z--@C!Rl^@;z{tF)}Rrmk^ literal 0 HcmV?d00001 diff --git a/windows/templates/tcpserver.template b/windows/templates/tcpserver.template new file mode 100644 index 00000000..6b27f49f --- /dev/null +++ b/windows/templates/tcpserver.template @@ -0,0 +1,20 @@ +[Template] +ver=2 +Name=TCP Server +Name[zh_CN]=TCP服务器 +Icon=tcpserver.ico +Description=A winsock2 tcp server demo +Description[zh_CN]=基于Winsock2的TCP服务器程序示例 +Category=Network +Category[zh_CN]=网络 + +[Unit0] +CName=main.c +C=tcpserver_c.txt + +[Project] +UnitCount=1 +Type=1 +Compiler= +CppCompiler= +Linker=-lws2_32 diff --git a/windows/templates/tcpserver_c.txt b/windows/templates/tcpserver_c.txt new file mode 100644 index 00000000..4f3705ff --- /dev/null +++ b/windows/templates/tcpserver_c.txt @@ -0,0 +1,78 @@ +#include +#include + +#include + +#define PORT 8888 +#define BUFFER_SIZE 4196 + +const char* kExitFlag = "exit"; + +int main() { + WORD winsock_version = MAKEWORD(2,2); + WSADATA wsa_data; + if (WSAStartup(winsock_version, &wsa_data) != 0) { + printf("Failed to init socket dll!\n"); + return 1; + } + + SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (server_socket == INVALID_SOCKET) { + printf("Failed to create server socket!\n"); + return 2; + } + + sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(PORT); + server_addr.sin_addr.S_un.S_addr = INADDR_ANY; + + if (bind(server_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { + printf("Failed to bind port!\n"); + return 3; + } + + if (listen(server_socket, 10)) { + printf("Failed to listen!\n"); + return 4; + } + + sockaddr_in client_addr; + int client_addr_len = sizeof(client_addr); + printf("Wait for connecting...\n"); + + SOCKET client_socket = accept(server_socket, (SOCKADDR*)&client_addr, &client_addr_len); + if (client_socket == INVALID_SOCKET) { + printf("Failed to accept!\n"); + return 5; + } + + printf("Succeed to receive a connection: %s\n" , inet_ntoa(client_addr.sin_addr)); + + char recv_buf[BUFFER_SIZE+1]; + while (true) { + int ret = recv(client_socket, recv_buf, BUFFER_SIZE, 0); + if (ret < 0) { + printf("Failed to receive data!\n"); + break; + } + recv_buf[ret]=0; // correctly ends received string + + printf("Receive from Client: \"%s\" \n", recv_buf); + if (strcmp(kExitFlag,recv_buf)==0) { + send(client_socket, kExitFlag, sizeof(kExitFlag), 0); + printf("Exit!\n"); + break; + } + + const char* send_data = "Hello, Tcp Client!\n"; + send(client_socket, send_data, strlen(send_data), 0); + } + + closesocket(client_socket); + closesocket(server_socket); + + WSACleanup(); + + return 0; +} \ No newline at end of file