From 5cdb1cc31104857df12327fdf33c75a5aa07c4d1 Mon Sep 17 00:00:00 2001 From: flykhan Date: Mon, 18 Sep 2023 17:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B6=E4=BB=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day3/homework/02.jpg | Bin 0 -> 32187 bytes day3/homework/h3 | Bin 0 -> 13472 bytes day3/homework/h3.c | 95 ++++++++++++++++++++ day4/test.c | 196 ++++++++++++++++++++++++++++++++++++++++++ day5/weak_task/client | Bin 0 -> 9240 bytes day5/weak_task/server | Bin 0 -> 13432 bytes day5/weak_task/t5.c | 43 +++++++++ day5/weak_task/t5_a.c | 42 +++++++++ day5/weak_task/t5_b.c | 54 ++++++++++++ 9 files changed, 430 insertions(+) create mode 100644 day3/homework/02.jpg create mode 100755 day3/homework/h3 create mode 100644 day3/homework/h3.c create mode 100644 day4/test.c create mode 100755 day5/weak_task/client create mode 100755 day5/weak_task/server create mode 100644 day5/weak_task/t5.c create mode 100644 day5/weak_task/t5_a.c create mode 100644 day5/weak_task/t5_b.c diff --git a/day3/homework/02.jpg b/day3/homework/02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6fbca59560bb1bc9bd5ea14df735cc5876ca5ea GIT binary patch literal 32187 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 JmO^X&{|2>WWgP$j literal 0 HcmV?d00001 diff --git a/day3/homework/h3.c b/day3/homework/h3.c new file mode 100644 index 0000000..d5e7edd --- /dev/null +++ b/day3/homework/h3.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +./a.out server_ip 下载的文件名 +*/ +int main(int argc, char const *argv[]) +{ + if (argc != 3) + { + printf("usage: %s server_ip filename\n", argv[0]); + return -1; + } + + int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (sock_fd < 0) + { + perror("socket"); + return -1; + } + + struct stat st; + stat(argv[2], &st); + int tsize = st.st_size; + // 生成请求数据包 + char request[64]; + // char *tsize = 0; + int request_size = sprintf(request, "%c%c%s%c%s%c%d%c", 0, 1, argv[2], 0, "octet", 0, tsize, 0); + + // 发送请求 + struct sockaddr_in server_addr; + bzero(&server_addr, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(69); // 服务器TFTP端口 + server_addr.sin_addr.s_addr = inet_addr(argv[1]); // 服务器地址 + + sendto(sock_fd, request, request_size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); + + char buf[516] = ""; + struct sockaddr_in data_addr; + socklen_t data_addr_len = sizeof(data_addr); + bzero(&data_addr, sizeof(data_addr)); + ssize_t len = recvfrom(sock_fd, buf, 516, 0, (struct sockaddr *)&data_addr, &data_addr_len); + + // 验证接收的数据是否是 OK + if (buf[1] == 3) + { + // printf("收到的文件大小为 %d\n", tsize); + // 创建本地文件的描述符(打开或创建文件) + int fd = open(argv[2], O_CREAT | O_WRONLY, 0666); + + while (1) + { + printf("文件名为 %s,文件大小为 %s\n", argv[2], buf + 2); + + // 收到的是数据报 + write(fd, buf + 4, len - 4); + // 回ACK + buf[1] = 4; + // buf[2] = "tsize"; + sendto(sock_fd, buf, 4, 0, (struct sockaddr *)&data_addr, sizeof(data_addr)); + if (len < 516) + { + printf("数据接收完成\n"); + break; + } + + bzero(&data_addr, data_addr_len); + bzero(buf, sizeof(buf)); + len = recvfrom(sock_fd, buf, 516, 0, (struct sockaddr *)&data_addr, &data_addr_len); + } + + close(fd); + } + else if (buf[1] == 5) + { + // 收到的是错误信息 + printf("error: %s\n", buf + 4); + } + // else if (buf[1] == 6) + // { + // // 收到OACK包,包含请求选项回传的值 + // printf("文件名为 %s,文件大小为 %s\n", argv[2], buf + 2); + // } + + close(sock_fd); + return 0; +} diff --git a/day4/test.c b/day4/test.c new file mode 100644 index 0000000..238e27b --- /dev/null +++ b/day4/test.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFFLEN 1024 //缓冲区的大小 +#define SERVER_PORT 1235 //端口号 +#define HTTP_FILENAME_LEN 256 + +struct doc_type +{ + char *suffix; + char *type; +}; +//返回内容对应 MIME 类型 +struct doc_type file_type[] = +{ + { "html", "text/html" }, + { "ico", "image/x-icon" }, + { NULL, NULL } +}; +void * threadFun(void * args); +void handle_connect(int serv_sock); +void http_parse_request_cmd(char *buf,char *file_name, char *suffix); +char *http_get_type_by_suffix(const char *suffix); + +char *http_res_hdr_tmpl = "HTTP/1.1 200 OK\nServer: bianchengbang\n" +"Accept-Ranges: bytes\nContent-Length: %d\nConnection: closed\n" +"Content-Type: %s\n\n"; + +int main() { + int serv_sock; + struct sockaddr_in serv_addr; + //创建套接字 + if ((serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { + printf("套接字创建失败\n"); + exit(0); + } + + //将套接字与任意 IP 地址和 1234 端口进行绑定 + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(SERVER_PORT); + if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { + close(serv_sock); + printf("bind()执行失败\n"); + exit(0); + } + + //让套接字进入被动监听状态 + if (listen(serv_sock, SOMAXCONN) == -1) { + close(serv_sock); + printf("listen()执行失败\n"); + exit(0); + } + + handle_connect(serv_sock); + close(serv_sock); + return 0; +} + +void handle_connect(int serv_sock){ + int clnt_sock; + struct sockaddr_in clnt_addr; + socklen_t clnt_addr_size = sizeof(clnt_addr); + //死循环,持续不断地接收任意客户端发来的请求 + while(1){ + clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);//接收客户端发来的请求 + //单独创建一个线程,处理客户端的请求 + if(clnt_sock >0){ + pthread_t myThread; + int ret; + //threadFun() 为线程要执行的函数,clnt_sock 将作为实参传递给 threadFun() 函数 + ret = pthread_create(&myThread, NULL, threadFun, &clnt_sock); + if (ret != 0) { + printf("线程创建失败\n"); + exit(0); + } + } + } +} + +void * threadFun(void * args) { + //将子线程和主线程脱离,子线程执行结束后自动释放资源 + pthread_detach(pthread_self()); + int clnt_sock = *(int*)args; + char buff[BUFFLEN]={0}; + //获取http请求的字符串,num 为字符串的长度 + int num = read(clnt_sock, buff, sizeof(buff)); + if (num > 0) { + FILE * fp = NULL; + int nCount = 0; + int fp_has = 1,fp_type = 1; + int file_len, hdr_len; + char *type = NULL; + char http_header[BUFFLEN]; + char file_name[HTTP_FILENAME_LEN] = { 0 }, suffix[16] = { 0 }; + //获取目标文件(含路径)和后缀名 + http_parse_request_cmd(buff, file_name, suffix); + //获取文件对应的 MIME 类型 + type = http_get_type_by_suffix(suffix); + //如果类型未找到,则向客户端发送 errno.html 文件 + if (type == NULL) + { + fp_type = 0; + printf("访问的文件类型(后缀名)不匹配\n"); + type = http_get_type_by_suffix("html"); + fp = fopen("errno.html","rb"); + }else{ + fp = fopen(file_name, "rb"); + //如果服务器未找到目标文件,向客户端发送 errno.html 文件 + if (fp == NULL) { + fp_has = 0; + fp = fopen("errno.html","rb"); + } + } + //计算文件中包含的字节数 + fseek(fp, 0, SEEK_END); + file_len = ftell(fp); + fseek(fp, 0, SEEK_SET); + //更新 http 响应的字符串 + hdr_len = sprintf(http_header, http_res_hdr_tmpl, file_len, type); + //向客户端发送响应行、响应头和空行 + write(clnt_sock, http_header, hdr_len); + + if(fp_type == 1){ + if (fp_has == 0) { + printf("服务器不存在 %s 文件\n", file_name); + } + else { + printf("服务器存在 %s 文件,发送中...\n",file_name); + } + } + //向客户端发送文件内容,即响应体 + memset(buff, 0, BUFFLEN); + while ((nCount = fread(buff, 1, BUFFLEN, fp)) > 0) { + write(clnt_sock, buff, nCount); + memset(buff, 0, BUFFLEN); + } + fclose(fp); + shutdown(clnt_sock, SHUT_WR); + read(clnt_sock, buff, sizeof(buff)); + close(clnt_sock); + } + return NULL; +} + +char *http_get_type_by_suffix(const char *suffix) +{ + struct doc_type *type = NULL; + + for (type = file_type; type->suffix; type++) + { + if (strcmp(type->suffix, suffix) == 0) + return type->type; + } + + return NULL; +} + +void http_parse_request_cmd(char *buf,char *file_name, char *suffix) +{ + int file_length = 0, suffix_length = 0; + char *begin=NULL, *end=NULL, *bias=NULL; + + //查找 URL 的开始位置 + begin = strchr(buf, ' '); + begin += 1; + + //查找 URL 的结束位置 + end = strchr(begin, ' '); + *end = 0; + //得到要访问的目标文件(含路径) + file_length = end - begin - 1; + memcpy(file_name, begin+1, file_length); + file_name[file_length] = 0; + //获得文件的后缀名 + bias = strrchr(begin, '/'); + suffix_length = end - bias; + if (*bias == '/') + { + bias++; + suffix_length--; + } + if (suffix_length > 0) + { + begin = strchr(file_name, '.'); + if (begin) + strcpy(suffix, begin + 1); + } +} \ No newline at end of file diff --git a/day5/weak_task/client b/day5/weak_task/client new file mode 100755 index 0000000000000000000000000000000000000000..07588cb5b8c73eb35a5ba7c5195fe125a825fc43 GIT binary patch literal 9240 zcmeHNeQaCR6~DIg-QqZG%?;iX4 z#g@>d{kI#vckcP!^KtKa=ic}3b-vf`?XcTyjEbFoogp`0Ds#xVGuCqxX9d>G%9+g8 zvzu56AjNRWyalOIBf2b16D<>R4xmMFHQNoK*)H=6QF2F=dWaPLWs5AT2EDY}V2Lv3 z<^bwpUtLbl0zJqpM30MpObAMP$f91Y(5n@CMCU}uh|>6QYUDXF;q9y+*H@pD8-}F7CvsYkFq=W?B|{+j&9(v&uihr9KiNK$15+~antLgO;6oZ zWB-=pu=n-L7f_cjsD9y64U%i}NH-P0Z!dtOjeK^z1@Kq_JX`=DE`aYVfS&-|4VSg} z0m#=+cLBV&0RFWCIHqAf`wX7HA0KxUi%0#3HJ$bA(MX)d^;pC|FvteASS%W2sv3gk z?c3G3-xmq8!Gs52*H~PO1oS9qqh~Y`)71fAC<4f#foMb^D%o?(IY3BH#35URD%8&^cOD=C4G2xXNX~vY%_sWzL#dYOwri{(# z#fzUoqcVD-?7ShA-g+}Mr8jPXd*yl=YRLCvV`@GPWn&HU_$X3yoL_@HK7!N?=PQuM z(5GJHyd8NAdFlzye_94ShB`ID`OC;-h*Kk+e+PLCZEBG7Zy{fX{6WtD4f%59yEy+k z@|ZFyne%@{9z&X{=lt)H$55u+oIi~`hA`#g{LR1zCxGXr;r-6!YxgV3x0KOKOI_Wa zvorE4nJKg9<|>fP{<%zMi+6+KC&9|~ZH!Gl4uRgU)J+0WMwgvRa^c9jDKv%Qt?He| zhV(oLKg8|#p2w&LCF0Lw`+nuY54eGIR~=wLNiHep7I!GNi^^+P_3JX$R*|*J^{n^2 z;eX^#8}y$gs`i88Vgx$Yd$IU~Qa7`G%soxJ;RURW?qG@HcOM14jIobUAwAcdItn^i zR~~$C4!W2;a|ZxQ@+FL3Ksiygu@(oDY+r7eIgLX&i_dx*Z;LNnO{bG%UJx8TgLgK( zcDe_`wHSnkDFD)`5y%u}d<-AmSzHH{YJvV{LH9gqaRu%TW*oiwG*oi_=E|E9e60LR z86QXCtZ$Sze0L^a%{U$b1#o5|t`|m#R&a!qnGwG5 zZ}h?&PU8$aI|WS`(F4#hHd8q^2O%&V1NbC>#^XM*dpV%ox|%;pnDPoVyejg?bGPS! zCzYNE!2j6$y1U`;l)v8OJKp4# zHn5Oh`wwOGyiM8uZsHwWQ10#Z+~?`_-0xA(Ph|7`V_0XnJ+b82#2ZAs6dSf|lj`BG z0g~(G#j}qtj6Jh(Y;58AQ@62=0k-hS4^kr!zI}XR;o-+CvhO>H1iSRRlW+fQeBt3I z7k={W;>nj69(l~ryEJv$y)jHo#E6gA`)n1zH24e;Vjo2>Jz} z4*^{bj{?8Du-K07Wws%gZQbh9vI$$M3vv9`o&!6ZP(YOY^56&BQT~Zf)9EFYb-Fs7 z)w?QJeYr-WC8@fhVm2Wi3wE zBlZ?&^+`v&(>-3);;j9CvEr;hR-!nYM@x4*<(RYCbw`>lh#wodT);=@v7 z5LPYPF;B2i`@gQHqsUL%Wh9wBUvrVc(>KhN-QX)g1`A)(fzmffHAfk{PEaDa-0%Xg zD=d^VU1ETg_w-G41DAsQDwcVT@E*ZazsX;@kS89}l8>ia$isBxJjHWK@R!B-g!=!S z&_34c=!$r*C8aWNx?a$)3fd%ShoA=p4GMZh&|`u=Cg?8&{jH!E1-1I$+1h%WyLNwH zBBCeUTct*+zOE_3xrPTCnxy(hsbR}4MuU4xeM3`yQ~h?U4J(gd^v!nJ3iG`{cV67V z^t^acCNIs#9FV0`dF4wOQX4Z{d{5po8 zht}d?*TeZuKKzEvKFzG-U@&XNx{!@h%H43EaAVw{iQ~e$u+LkK-%jc~sbW(PIA?mtXl@o&h}H zxC)K;Ic{eSn_n$MEnB9bnlBD0kezA~@wEnsH=a2LE?t@*Zr%deb|dI38V z1@NZ|;4c@z|5N~fvjF}%;MjlbJgR^I<~wKlGT`~*Ru6cU{YExnnRj<04jyRzDH1XF za{Eq(+g>ahzcY3p#|2{|b5M7|SIQF>`wn4eUaXUwgiZ`_l(#;Y2ZTKCv$61RV4$M~ z{QkHA{v6ZrvVa!T4u#^n7E|>B6^`yA8XoxtqUxb=w9gk-;SettSAB^g=8p~xhBaLaNZYn< zZ_F>G21AjM>WjsE!>Sh1W5X;M^9^WfATcm73@Rp01xYwSG>Ha$ymuXYJ-gf0_C0OT zJ)^Hw&(R1lwe6lgp52|TAZ2RdM~wi%QMKBxsD?GAZ7)-IdhcrSc-6Z)I`*}9tKFU! zZ##P62bBJJg7=+HL}i%{Ch-tb?d;yIW<%AzyA=b~?duC`{E*Zltp$9#4=m>%oMwd@ zjnmgGfIf_4)m+RtM9szc@oFx#;*izajQufAT(ifvR+*erS;&BRRPFag0x&|g^Da;h zgd%Dpu0hzd5yP-&Ho{heeet;P$k*Kaoo|eu!-FHZE zhaw57FA;(tQbGYHA=mGV_cJLl907X<)ni7>5iJ%EMI$+k3T-hh>_Y`n8w~4A;*pe~ zDjkXft7}7W$H@djQJzkc)-R?{Kb*N|I78K#M}`K~zv%}taN`>Y`JoR{9nAxRxhcWJ zVG_*f0hpzhHR``%@%si|6`A)ceYex^g|uHJ+bC-;UjYX9Xs~?oLf`lFdz@R~MCd(1 zd;?U>`m_(wg~1IZD5zDx4e%?lrz8K9c9}~~3V`}w%+c(=SFmgkRB#VV`crlpI5?jb zz=#+y?t`&v-G3ec4EMOCPy3H%(NWqbg9tCy_}vdE?ommf_9>TzzS~gC?8`}x=wWEb zJumUJpQ#oDmW95x{{m+C{fVwfpY}aHLcdxFTH{CfLqfkr$kD!iP$ zb7;u%Un+Cad7?x?2^=Y5iCJt80Nl;LHR_5|cU{If)AAOH?3H`8H z80yyX{KleBzkk#3;*A!4tN&?>KJ71;g#S-0`d0t1Lc0?#3KQ)Y=y!6fyp_lO2cD>t zKAm$_qfsbUc`N@G#ZK z9269iH@GZM_=nJ7*3ayxg@fayC@AR>UAE}ce&M*#r+$(d(j)#VR1l-_(|7QsP_)X6 zaF9B40DxG11~Dq6kG~_E3+WTBf=2RfmfIzc1n?~0Tr4d2O>@UAHz)efe^G>nFTu4L WE*cN5e>gw$`EM2iYb=dc|NjB##w~aN literal 0 HcmV?d00001 diff --git a/day5/weak_task/server b/day5/weak_task/server new file mode 100755 index 0000000000000000000000000000000000000000..8b83f9c900a49b6f7a5f07909cf4ac5e41f24ae4 GIT binary patch literal 13432 zcmeHOeQX@X6`#AaW9RE^hXBTjnia&ewgeq0)A2-(CoA;ad-pst2o!!}aeyE|j(QdObN_O@QhFnX&%pv2Kv9Vh@E3g{2 zkjZQnTgesxk_(s2OOP5lqI1GD(R?B20Gb0=jokoh>@v>~U1`8jgOR9(NU^?Tl10{_ zy3=5ZGA3~V^{}mlU*Rm!cAgXiw-GNDKGtY{cf>L2zEuU28N)h+{v zyo`j^^WP*zSxha{x)<~EQqBUEd4_0}0W+ec_f62lc7EAZC0Vj_XQ&T<^46)<<(WLaL~1m_Z#h_?1oL-cunL-2{>%?a=35~V7dME;_tjO zFm?axufErHX{51CTNWKaUAiFqrBf+LE=wc5HUr+A0Z0F)vs0V_Z^(e7jdXT;GvM7B za6JS52;dT2*0ckFboK7ffN#x!MH_>z>YCYG=`8$|N_-1Z=NU8zX>L_Jr+BZTuP7Bu z?L3^>6? z9ZsZn6TT>cGS*|lmzeNA6E2oOUfOTM#S+i)K@(nJvU9+M)7W6~AroF?l2?X4$XAAQ zr;8<~L?`sznVVn~l%d!1Crv_-onQY)5ScH13w{e$$&f?72ZiG2<{_2-4tX5H_*u@s ziaZWoe1h{Qkar+|l=Ckjk3$uIn)A;gk3$qc#QC2hk3$n50E_2Lzr4k#lfResnMdvk{p`@1r9ezv8xX=>u=5}7Ger)5s28W+lJ=3dbIxT|1Q zJ-k=^8U|#WQho%8GBoE@V$-`6yC~+ZpA}EBdtwYm3QR!7A1^Y1BV>*H57REK;-$6lVg^u(mU~2LZBu z#A_Ot;DN6U-OVDo7k>zP31gQ~Vg77ed=Kbgeyg(ggE?qp?Bo(al-P^tF0V42Q(A_- zi8ahrPMp9#oWjX4jz2Tcg9l?#^!w0B{AB~n$A1fsnu$Qc7y$F}Js_xzL~*Q6;Y3zq zQ#0LA+BL;7I~$i*fu&<#02GU^1F>A;(omqB3L?O?e08paLvbMh;_J&ra`;2ei)ccMltT85%SCy}s$g7J5;(ubfZ{vfoW;N@s76coHX0SZlkVlKKG zRYsyMoQS$YImeA2y=r*W|2b668=wr2pz-0uCN($AjM$m+S*VN;gsAGR(wXzXBWLBWRI*&276#obP29?;%Hse)pTgm4ztcrJ` zjlHkoJbwUhMdrTOz1|FVzw2IJMmo+7wp-8&(9A6Ed(dE09^o+>j+Q=V{#TqAJAfaGC;!jUre?=TbQlC z(6(YpUj89lULoSR=NSW6tw8~i(#tcp8p=_=2kI_F+s?v9XYoA+iyzD%WOtX`x#qUj zH=+rYtA}elwC!K$GPkpEzrAkh0%geIc;61S0|p6Y{BV`QbkGo}brwEquXPq5bTl}n zk(^p**(14%vts`O#aT0yx6vtwoHcG|h1*$H>y$tadLZk8tOv3l$a)~_fvg9z9>{ti>w&BX{vSLb!S`97h>Avu&lZWZ3HoNApJ&L^ zxB6r7X${j2{1?w#+j(w<;KgSKRwDRfQBLQ)RQ}18`5=mn+GQk(GvA&ZgQv5KF}uOj z*}`u?788Ep##C$&cCDa99F&32$C&6F#h~T;44r*k&!reUkSp^X;eCRqc2j+H20}c1 z2I2jYg*vloA1l=v@enEdE=(B>pBsM^ZO?|fx;vz@Z5@$-9+B3&s$3Q2)e+8Bez&sPRZ-=tTz896 zAg!yYtgfi8xZP^Q$~#~-*Vtt%45xSY#5ujW&;ccSTKSyBJWZ9)Wn*dO7r=>+Y!>Bt z2g_sW#^1s68ObEF_$^uYa^{Asra=Fk8iBW!LEaNj&%6- zjLv7xIu2Y##5$3R-@r!G;w21^qpZonXcbJB;QgP&F7eZcB+3}BuQphp6bswZSS(?WA=G;{a@F{JBTiNjx8b$Fv_VTbgls2Jm$K%GBTI zxSeIJ&nZJLnZ_WS&JQS&&i-p$^_r{Z!`s}>)#Ls*Ay3aK&ce?np1FE{=0FE*Y34%- z;LE`Oc-o1Ho+oQK&Y_eaH{enVVlZW(D8bXyIDSb8F1{c)jzj!zftd#v=;Cp`wi@A%l)_+aj-<| zQjSpB0XUAMEXGk2c!1+cyOhIookF;ej#}*BD(p}k-5Q~=4{(&Xj@Ka}kLTl<_!$k* z!x`#5k^w)F0e>R{{x0AWR%l6|0FHjMw$tWFFOLxp%iyic`g~ad^6AErb%yk?9_i|G zbwWJOJ#|~u=BBN!s>-}tNbB~6buFaoy(+}>1T>7;@dnjyf3U;jS0S<|6jnWve%2Z6 z?elB8=5>92{q0rhh14!zz^8gbAk4^#HPsvG?HvFW6Q_cto+9e);H_)i z;@;SxHf*Yg<{53Je2RvbsrC17a&K&^11VDpk3RwkLfzB`MK!D`^;?*_p?PzyyII}b z*toT!Rc&?GHaB1mJZh;k9N}$G21Us-MJi!@lG@a|QB69lbz>d6s@2os*Ld`lMOyQE zbdQLfvJ_dOtdgZwMs!vZz2v#b_gR@eht3tG_#n@~kQVSfD61D|% zA{hF7H49>={%K86~^5P}mm?q%bO!g*3kh z6-2JjuQL~SstdBN?jW$b)(^jUr-4wA&or0TBkrvpFBl=tP&IBcLxb`=J3$Pp@$~vS zp$$PD%>#nd)&=9lTyVSh!YyoBsQyb9-(jnM7Y0|8prBU$dcZHko{{PwwaZ+R;+U!Zxg2G%gGf!A zfW5tiE;2`cm07pfKai5J@(l16KNZa9pr9Gif`xzd|1~~1*ALD6Ak(Uw*JAYdp$-!bU9nU9kK5`7;rIHRqUM;e36tWW#53Zc(qK}-sT zB2V-&i$3l1WYJJ+FPX6NPg(ToJ*PzocA#@jiRvZjXOJ{g<0gduASnuJZ9mRWte^BLzMkUlt1SA~`Z37PtWW#Ze(@pfbBn&U{@0=02^Zc& zm}vh&arjnwE06n`0=P(@_P@m#unoy7Z{^_!BlKK}w7w0bN(|(%%PvR^Z zhm@G#1`F@LMj8cTuAlbZbE}MUYkP?&`cI2~Vt+0f`e@&rNRQ|o6q@U&{lutbXi+=K z2I&!h1u}?H|LHyXh-64u<%K(pLev8Qv5Ev@WJsR}pqt7_pJ)-3QQamn_Vce9+!7KL sg%+0AO>^I@e@-&EQL&ETbXW@)^#|87Obg*kSATyQFJ@~kh1UB21IAX=>i_@% literal 0 HcmV?d00001 diff --git a/day5/weak_task/t5.c b/day5/weak_task/t5.c new file mode 100644 index 0000000..9d0c8b8 --- /dev/null +++ b/day5/weak_task/t5.c @@ -0,0 +1,43 @@ +// a->客户端 +#include +#include +#include +#include +#include +#include + +int main(int argc, char const *argv[]) +{ + int a_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (a_fd < 0) + { + perror("socket"); + return 1; + } + + struct sockaddr_in addr; + bzero(&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器在本地 + + while (1) + { + char buf[1] = ""; + bzero(&buf, sizeof(buf)); + scanf("%s", buf); + sendto(a_fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr)); + + char recvbuf[128] = ""; + socklen_t addr_len = sizeof(addr); + recvfrom(a_fd, recvbuf, strlen(recvbuf), 0, (struct sockaddr *)&addr, &addr_len); + printf("%s", recvbuf); + + if (strncmp(recvbuf, "bye", 3) == 0) + break; + } + + close(a_fd); + + return 0; +} diff --git a/day5/weak_task/t5_a.c b/day5/weak_task/t5_a.c new file mode 100644 index 0000000..f90777e --- /dev/null +++ b/day5/weak_task/t5_a.c @@ -0,0 +1,42 @@ +// a->客户端 +#include +#include +#include +#include +#include +#include + +int main(int argc, char const *argv[]) +{ + int a_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (a_fd < 0) + { + perror("socket"); + return 1; + } + + struct sockaddr_in addr; + bzero(&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器在本地 + + while (1) + { + int n = 0; + scanf("%d", &n); + sendto(a_fd, &n, sizeof(n), 0, (struct sockaddr *)&addr, sizeof(addr)); + + char recvbuf[128] = ""; + socklen_t addr_len = sizeof(addr); + recvfrom(a_fd, recvbuf, strlen(recvbuf), 0, (struct sockaddr *)&addr, &addr_len); + printf("%s", recvbuf); + + if (strncmp(recvbuf, "bye", 3) == 0) + break; + } + + close(a_fd); + + return 0; +} diff --git a/day5/weak_task/t5_b.c b/day5/weak_task/t5_b.c new file mode 100644 index 0000000..483ae28 --- /dev/null +++ b/day5/weak_task/t5_b.c @@ -0,0 +1,54 @@ +// b->服务端 +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char const *argv[]) +{ + int b_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (b_fd < 0) + { + perror("socket"); + return 1; + } + + struct sockaddr_in addr; + bzero(&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = htonl(INADDR_ANY); // 接收所有本地ip下同一网段的客户端消息 + // addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + bind(b_fd, (struct sockaddr *)&addr, sizeof(addr)); + + while (1) + { + struct sockaddr_in src_addr; + bzero(&src_addr, sizeof(src_addr)); + socklen_t src_addr_len = sizeof(src_addr); + int n; + socklen_t addr_len = sizeof(addr); + recvfrom(b_fd, &n, sizeof(n), 0, (struct sockaddr *)&src_addr, &src_addr_len); + printf("%d", n); + + char sendbuf[128] = ""; + + if (n == 1) + strcpy(sendbuf, "disen666"); + else if (n == 2) + strcpy(sendbuf, "jack good"); + else if (n == 3) + strcpy(sendbuf, "disen888"); + else if (n == 4) + strcpy(sendbuf, "bye"); + + sendto(b_fd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&src_addr, src_addr_len); + } + + close(b_fd); + + return 0; +}