From e7146fab0f17d68a31b990fc01bcbe4993547403 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: 2023年8月19日 12:50:23 +0800 Subject: [PATCH 1/6] [Learning] int listen(int sockfd, int backlog) --- 5/5-3testlisten.cpp | 68 +++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/5/5-3testlisten.cpp b/5/5-3testlisten.cpp index 7196c8b..e88be3e 100644 --- a/5/5-3testlisten.cpp +++ b/5/5-3testlisten.cpp @@ -7,46 +7,66 @@ #include #include #include +#include + +/** + * 执行: + * step 1: ./5-3testlisten 127.0.0.1 12345 5 // 三个参数:ip,端口号,backlog(backlog参数表示等待连接的最大数量) + * + * step 2: telnet 127.0.0.1 12345 // 使用 telnet 链接 ip,端口,重复5次以上 + * + * step 3: netstat -nt | grep 12345 查看链接情况 + * + * 结果: + * 观察到前5个建立的链接状态为 ESTABLISHED,超过5个的部分的链接状态为 SYN_SENT,随后超时 + */ static bool stop = false; -static void handle_term( int sig ) -{ + +static void handle_term(int sig) { stop = true; } -int main( int argc, char* argv[] ) -{ - signal( SIGTERM, handle_term ); +int main(int argc, char *argv[]) { + signal(SIGTERM, handle_term); - if( argc <= 3 ) - { - printf( "usage: %s ip_address port_number backlog\n", basename( argv[0] ) ); + // 参数需要大于等于三个 + if (argc <= 3) { + printf("usage: %s ip_address port_number backlog\n", basename(argv[0])); return 1; } - const char* ip = argv[1]; - int port = atoi( argv[2] ); - int backlog = atoi( argv[3] ); - int sock = socket( PF_INET, SOCK_STREAM, 0 ); - assert( sock>= 0 ); + const char *ip = argv[1]; + int port = atoi(argv[2]); + int backlog = atoi(argv[3]); + + // 创建 socket,PF_INET 表示 IPv4 地址族,SOCK_STREAM 表示使用TCP协议 + int sock = socket(PF_INET, SOCK_STREAM, 0); + assert(sock>= 0); struct sockaddr_in address; - bzero( &address, sizeof( address ) ); + // bzero() 是一个函数,用于将一块内存区域中的内容清零 + // 需要注意的是,bzero() 函数在一些新的 C 标准中已经被标记为不推荐使用,可以考虑使用 memset() 函数来达到相同的效果 + bzero(&address, sizeof(address)); + + // AF_INET 表示 IPv4 地址族 address.sin_family = AF_INET; - inet_pton( AF_INET, ip, &address.sin_addr ); - address.sin_port = htons( port ); + // 将字符串类型的 IP 地址 ip 转换为二进制格式,并将结果存储在 address.sin_addr 字段中 + inet_pton(AF_INET, ip, &address.sin_addr); + address.sin_port = htons(port); - int ret = bind( sock, ( struct sockaddr* )&address, sizeof( address ) ); - assert( ret != -1 ); + // 绑定套接字和地址 + int ret = bind(sock, (struct sockaddr *) &address, sizeof(address)); + assert(ret != -1); - ret = listen( sock, backlog ); - assert( ret != -1 ); + // 设置套接字为监听状态,backlog 参数表示等待连接的最大数量 + ret = listen(sock, backlog); + assert(ret != -1); - while ( ! stop ) - { - sleep( 1 ); + while (!stop) { + sleep(1); } - close( sock ); + close(sock); return 0; } From aa9d60998e25ac2b52db79cad8b61bc8c7309440 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: 2023年8月20日 14:01:23 +0800 Subject: [PATCH 2/6] [Learning] int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) --- 5-1byteorder | Bin 0 -> 50025 bytes 5-3testlisten | Bin 0 -> 50650 bytes 5-5testaccept | Bin 0 -> 50698 bytes 5/5-5testaccept.cpp | 73 ++++++++++++++++++++++++++------------------ 4 files changed, 44 insertions(+), 29 deletions(-) create mode 100755 5-1byteorder create mode 100755 5-3testlisten create mode 100755 5-5testaccept diff --git a/5-1byteorder b/5-1byteorder new file mode 100755 index 0000000000000000000000000000000000000000..53a710eb9b6ad7148fb29264eeb526a33e1981c1 GIT binary patch literal 50025 zcmeI*ZERCj7zgmDw;dK3Y#@=%m#p}P11TUFF__W9CL0#Tc@Xs3B2Q5`;+N%LfyTS%M^EKF@tAZ71@H;D`T7 zPS1VrIp?|O{BFB%2fn%X$Mtd|7je zCl}wE5J{dNc%V`(4dIsJZgYO1_#W9YFNK^cBa|}q9z(9IQkrk1&f3fYyI*42SH5^C zlfUK*rP4-sG@ZXyn(w6*Rz5Z|i^PTbymmgP-^!;p>4`2q#WPCtCG30;+xa9e%tsT} z*P1p`@npL_zBJ!}oo}w)FL7Zh%FP{0btkvQlQ9)fwso3u@%uPo=aY9XMdH#NR*&^5 z?^Udost>jV)vBg-8?3h*u)kE?nx&+5^G&Jp?kl+})!td~T5p=q%VW(Fu;$wlP2!8f z@1d;gH?G#YoKf6nO4h}(Sprt$tjpQ6Qi+I4_jW`(6ROKd-85f*U76x_-Nk90T=E2^ zVi6-ES5_%qpEqNz&&emTtm$Uu#_#jFHS5+k)UR=VTe*^bax5ioCljkeuLoIXkqpQY z$+NxOR&nbTU(R|@i@0s%o3bbA&u}dESGWyxJC$pQs}$!M@<$DESGZszR&4A z$j4QFUkkg_sfCGnbYZMF5#w0OeOzT7FI?!?&KzDEJ~1tL?t^1%(@*d{A6ILSyejup z^V;10&1A+0^>FijaYj|uGWgC5&^+T6ydWJ4vTvk&?TU;(` z8TyN_C)1WgL~=rQfC6<{k07ADQL*AwFLE_xSj1VT{JxeR?t$k0hs1B5oK7Js)-_Hzzx{CH;Q?6zg2;{W5_| zVJk;N<;?q1zly--^q>|$XJ5^^W0SG_<0ux=z1rwwb2twv=5p$##aohaf zKmY;|fB*y_009U<00izz00bza0sg_<0ux=z1rwwb2twv=5p$##aohafkmy;|fb*y_ z009U<00i!0@enno!puodhxw~5qdtgi@nlr-qfdq0d9t^pd-}-~z5(lndjmmpqdsly zo}_0;>)5399=)~O(A6eAA`_Qvd^*}|=$$DJw$f7?&vMhq4*vM^RY@UbWXE>1t>@3_ zULtRXQ}eY9uHcK2IxC)G#+CeO#gCXVQN8`|7RCJxpv=8F+nxZUlzEF)wnhxy%Ikby`>8y~kFVxfwj*U0-{bXY%*LzG%(cm^u-QvA zjp$U!r%|~b-=YaP{jMh$EY3UA>4wn31ED#I7hgX3=JGFS?%;wW&7XhOJm;h1pY;8j znYZ`-*N%P|?mYc_Th8WZsB&e?OjpMP~YGX_yqy|C;bGExCZ literal 0 HcmV?d00001 diff --git a/5-3testlisten b/5-3testlisten new file mode 100755 index 0000000000000000000000000000000000000000..d0936fd6f32d510850aeb5a33434c7361bec840f GIT binary patch literal 50650 zcmeI5e{5UT700jbq;>i$ZrZh_zv8Sg`h(U9(5{81eO+7Hu+nBpk+N#*?Th^qn>e=d zdv2SO4v$c6Fp0$#AhaKaqG>c0)vAqcv8Jto!u~+h(ul28FrjqXM8ZIg#Dro*$1?K(H$%d{GMzw~NIQn}E2U|rTFp;FrTNC|oqWA&1p9^gyec0tw8hCM!$ve=Bq>sw z@B5pae5cfS_6zfgYw8P{Rx%Q6SK~|b)oyn3rBy%sg;JE8I;2d+4n<-i8hu&uznkNkDhd0gISTXhxjtp**|ufx7P)oL?q=t7HK#5?tt}<3hk~qp_c8w6+v5eto8)ip z@mO0lXTI{p6f*K>z%j0Cy?x&}4@Z=wOX?!u7R_n$b#cogWmK1DS7&QHDic;x)#dcr zziB7mfqaPk{9F!AC7s2F5-CHvrRP1)UtHgTw3E-PhOl3lZ*rz%N!e;n-rj5Tg=s!B zX1$)2#wWk`T@AaxzI|Im{#zYTIW(1pe3m!(<0l6vxC{4A&aa~}TtQz*PH@0a^{A7aWQl)^Px3)K@`wQ5b>8Y(K%YS+2GV0?LK1`#hF z-`r(dM(3KZsVSUQe1(+j@e@zxze4%Umt_el_Ya&WPIe(2g@6DEfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=9 z00@8p2!H?xfB*ATwF%Fr9FvtE~$V?EVVJ$`QM(*9>WOZ!juEEykm zrJLy8S#QmSb(u3lJl^No-@kdLxc^<3*n6ty+v9@fjv9~f(d&j2v`jkg88_^H%L$Hc%HXh%Z)4&v>xTC&~o3UF~b3owf&h|?kM}KL{_7D zHKY}!fA>_JKF;x*MRxRNExXwz?jQZ_(+gL)L{ozhU#)PS@AZmsea5c2yFT-5dAf-n zx%CDUn=-95_f${}o$FaTe$G=p-oSaw#fHm^w48gk$naVnG-f2AWktQHx`)@APc_k; z(fL}I#&!+Ux|eBxZg;wAANMb#T9#?qX(C;j-PzlP_C>`5W^4$slDS0A{mkM2rlz#}hyiRMjg z6+?8!+5B27n4wE-ptwE8?ynYIBh^~hDCvr$-Z{%_yepY!eoVFB^VeFRyG6LGFS6|` zu*WJV;};6-vjui2(0^3($kIgE`uk4{&ZXee%w&PqMx4qMaT^pUrf*dj9 z?}hCT$maK`3Wn>-zHmE_CLtx_t_l3OmZW(K_CrtC zdTxBS!%u1Mbr|HaQx?E=-_sM;@hdsrR>KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00jOo2+Uq4zQu)BX;Mnl(t{l`819hmDLoky z-$;sHEz}haQBSH>wnkzhgF-ysbY|$LX(TO~v|nRY8n3iFC8hMFiBxbeo%$?+!k@lEw zuh+<4)g!j<)xu6z*km@y3e`5wt)1utsq>|oV9GLN*wA@fHJy4SCT?=m7?1eqAa9c7 zql5irerkU~I?E-*3-y$O?3a}P7v*1M-z&s{wA24j_A7)4E1%O=x_tEO^v|A-eB$ z{KZb3huN}{ercUg{Ea34o)Z7w5?_}1Mu{IS@eh^w50?1fEAf9=;y+p9pD6LCkUy1_ zkcerd(@AHL&Lo{hT1m=uW|LNt5=t?L^nab_7xFr1EA6wT8(wf94IDOxDG2ocEpB#%-VX`ae2)*n8oQ=}S&%`)mH}>YDJq{OUbB-uJyaxZvoP J>fWB*e*m)NmS+F} literal 0 HcmV?d00001 diff --git a/5-5testaccept b/5-5testaccept new file mode 100755 index 0000000000000000000000000000000000000000..74eb13970203ca79387f7ddc61c606a500df5d79 GIT binary patch literal 50698 zcmeI4e{56N700jb1e`!2KhWq%+L->BAQT+BGAJYPXow&SBUzG85raNn>=)uDv5ns| zBr9#brPWH;Zt=z>R*DKst0ft$vT9Oe2}&3fVw1Ku6F;hLY7O1AgtZcg{fLnu`=0ln z;pNe_Ql+Z><6pV`TRo!X4eQ-^NxD9+nhD9cUN%}rCMjs4QpF=6>gMP!Xu$g-|>>7>l&j5o5< ze3-w|!=RCGNpm1aBurs`%Ce@%TeKTP&Ui0Yn(_Lr73ACFd98S0Xf!jP+@^L!)fh&c z@z$+25<~3y6ドルG2boK=>S>7J89V`3~ zk4I~bCYk#!PfUZDm37clUSlvbj%_00$P2#FB(uxrm3?Me?oec{yR#+IAxHJt|BV+l zw+pH+iji&8A#UUhEz3bgSF*FW<`+$v`fx7+L~)H!rvR{pNfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaaj;`6V!U!aaKJ zvHXE+J?ZFvY6h+^mJ$`e~xL-

DZ{PmaSEp&;78X=bFnOE+5#lBTZ7xJHfcvbSd zo`zCCmIsuuNSGY_4qE4DDt}U+Q+AVbi51Mc&93pk7VN^ zx9(36>!BPgH^i#N{t?9PM1R5KN_vssSQT|=QLewSE| ztEf0Ha~&A;F1%csOc&F+}vz4)#QjrK8t&Ndnc>JXu3>vkCjQ?D0VjsciCCemx^xcw`_XIrh9EVYSZ;LU18G&Hhrnk7T>0a zY`WK`qn6%L=q@nwTYqeT`k~u|k#jw+O=c!1=hCkS>Hk2}T~X3kpzpTyCFrkO`U7ax zxUuFU^uw0^2efMGzd`S?^m*tfEd37j4=w!{=!2Gi8~RmCpMgGN=|4gL4mz$W+tro6 zdo^DuDl5TYOw}}BG!oP0aJ;icjpd6@B@`C^hcz{(`P<@3nq;mbhr7*|1xazyf%*t> zHL9_lYRnv1=3lmWnXYQO5(ubKeMul16NfC(@GCcp%k025#WOn?b60Vco%m;e)C z0!)AjFaajO1egF5U;<2l2`~xbzyz286jp>NfC(@GCcp%k025#WOn?b60Vco%m;e)C z0!)AjFaajO1egF5_>2i`!5>@TKSV^E)3ドルNDu=?k$exKF9Z1qD{f5hrfS^a6NPh0)_ zRzG3&pYh}J*E0bozyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1egF5U;<2l2`~xbzyz286jp>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1egF5_*@bwyjwg%i4{q*ENi+FXqN+R?eg}x5(|oN#6+(Y?CuC+Cf*{qgu+1;L$qEq zcPN^s#&kKRhcT>qjVNj?7NJ#Ifg@jQ9*NTIhU`F8j~KbsW1u6X>8jy1!;8j3VZD_WZ-b|G zsH(BEjhslJU8QXBX9%*6ドル>hn+O;)?qKwMYlHdUd=p5Lj2!s1>x)_BB7oFJf$#D{aK zKLMMCKT_zbH2+WG9Qj@$q6yQdZL?hk_%!`57(Vu|H2qR@oR%4_9G?hx!~e3wuXgy& z4u6}&Z*}-lhriR|Kko3Kari%W`1>7xpTi$?_^&zq9QXus8VuM(9xNX=12z+O8*CPA zHjF41!ir$iVa2ddy5A?{4>@buIBUESw)%!=R`!$^#i;2iBj&4AY zO4yV}@n*|5Td-ECW{dQe_feKNZ(Mr6T-VsRONrKm^`&3Y@leJxl>AObSHUOSuD&yK z1Z6c3KK<M|nxk@|lA;FmCocKi#xa;9ANeU|XI;w{FVj`}O)*~e znMIv%Jp0m%13#^L9B&=TIX61m z?yhUjo!tHF-QRxt&qu$%Vb6U(|G0U7ZQm;=4<9&vpla+~@qf>=w-n}`TJ`SME2o}% zq2NmD2inK&|Fq{koY;2c8RD{clXKo%Vdi)&~=wpKL2X`M{ahSB`($-!C5B mnI3)N==1koPS;gkefQDeu6s((bss(Q+xPysr{vA*t^Wh_hvLxy literal 0 HcmV?d00001 diff --git a/5/5-5testaccept.cpp b/5/5-5testaccept.cpp index a2b95b0..cd11d69 100644 --- a/5/5-5testaccept.cpp +++ b/5/5-5testaccept.cpp @@ -7,48 +7,63 @@ #include #include #include +#include -int main( int argc, char* argv[] ) -{ - if( argc <= 2 ) - { - printf( "usage: %s ip_address port_number\n", basename( argv[0] ) ); +/** + * @param sockfd 需要监听的服务器套接字描述符 + * @param addr struct sockaddr 类型的指针,用于存储连接的客户端地址信息的指针 + * @param addrlen 一个指向整数的指针,指示addr 缓冲区的长度 + * @return 接受来自客户端的 socket,返回值唯一标识被接受的链接 + * + * int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); + * + * 在 sleep 的 30 秒之中,打开并关闭 telnet,accept 依然正常返回; + * + * accept 只是从监听队列中取出连接,而不论连接处于何种状态(如 ESTABLISHED 状态和 CLOSE_WAIT 状态),更不关心任何网络状况的变化。 + */ + +int main(int argc, char *argv[]) { + if (argc <= 2) { + printf("usage: %s ip_address port_number\n", basename(argv[0])); return 1; } - const char* ip = argv[1]; - int port = atoi( argv[2] ); + const char *ip = argv[1]; + int port = atoi(argv[2]); struct sockaddr_in address; - bzero( &address, sizeof( address ) ); + bzero(&address, sizeof(address)); address.sin_family = AF_INET; - inet_pton( AF_INET, ip, &address.sin_addr ); - address.sin_port = htons( port ); + inet_pton(AF_INET, ip, &address.sin_addr); + address.sin_port = htons(port); + + // 创建服务端 socket + int sock = socket(PF_INET, SOCK_STREAM, 0); + assert(sock>= 0); - int sock = socket( PF_INET, SOCK_STREAM, 0 ); - assert( sock>= 0 ); + int ret = bind(sock, (struct sockaddr *) &address, sizeof(address)); + assert(ret != -1); - int ret = bind( sock, ( struct sockaddr* )&address, sizeof( address ) ); - assert( ret != -1 ); + ret = listen(sock, 5); + assert(ret != -1); - ret = listen( sock, 5 ); - assert( ret != -1 ); + sleep(30); struct sockaddr_in client; - socklen_t client_addrlength = sizeof( client ); - int connfd = accept( sock, ( struct sockaddr* )&client, &client_addrlength ); - if ( connfd < 0 ) - { - printf( "errno is: %d\n", errno ); - } - else - { - char remote[INET_ADDRSTRLEN ]; - printf( "connected with ip: %s and port: %d\n", - inet_ntop( AF_INET, &client.sin_addr, remote, INET_ADDRSTRLEN ), ntohs( client.sin_port ) ); - close( connfd ); + socklen_t client_addrlength = sizeof(client); + // 接受来自客户端的 socket,返回值唯一标识被接受的链接 + int connfd = accept(sock, (struct sockaddr *) &client, &client_addrlength); + if (connfd < 0) { + printf("errno is: %d\n", errno); + } else { + // INET_ADDRSTRLEN 宏定义,用于表示一个 IPv4 地址的字符串表示的最大长度 + // 该宏的值通常是 16,因为最长的 IPv4 地址("255.255.255.255")有 15 个字符,加上结尾的空字符0,円总共是 16 个字符。 + char remote[INET_ADDRSTRLEN]; + printf("connected with ip: %s and port: %d\n", + inet_ntop(AF_INET, &client.sin_addr, remote, INET_ADDRSTRLEN), ntohs(client.sin_port)); + close(connfd); } - close( sock ); + close(sock); return 0; } From 806f5ddb5653448a638dfa8c0b9940b20cad4f69 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: 2023年8月20日 14:04:05 +0800 Subject: [PATCH 3/6] [Learning] int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) --- 5-1byteorder | Bin 50025 -> 0 bytes 5-3testlisten | Bin 50650 -> 0 bytes 5-5testaccept | Bin 50698 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 5-1byteorder delete mode 100755 5-3testlisten delete mode 100755 5-5testaccept diff --git a/5-1byteorder b/5-1byteorder deleted file mode 100755 index 53a710eb9b6ad7148fb29264eeb526a33e1981c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50025 zcmeI*ZERCj7zgmDw;dK3Y#@=%m#p}P11TUFF__W9CL0#Tc@Xs3B2Q5`;+N%LfyTS%M^EKF@tAZ71@H;D`T7 zPS1VrIp?|O{BFB%2fn%X$Mtd|7je zCl}wE5J{dNc%V`(4dIsJZgYO1_#W9YFNK^cBa|}q9z(9IQkrk1&f3fYyI*42SH5^C zlfUK*rP4-sG@ZXyn(w6*Rz5Z|i^PTbymmgP-^!;p>4`2q#WPCtCG30;+xa9e%tsT} z*P1p`@npL_zBJ!}oo}w)FL7Zh%FP{0btkvQlQ9)fwso3u@%uPo=aY9XMdH#NR*&^5 z?^Udost>jV)vBg-8?3h*u)kE?nx&+5^G&Jp?kl+})!td~T5p=q%VW(Fu;$wlP2!8f z@1d;gH?G#YoKf6nO4h}(Sprt$tjpQ6Qi+I4_jW`(6ROKd-85f*U76x_-Nk90T=E2^ zVi6-ES5_%qpEqNz&&emTtm$Uu#_#jFHS5+k)UR=VTe*^bax5ioCljkeuLoIXkqpQY z$+NxOR&nbTU(R|@i@0s%o3bbA&u}dESGWyxJC$pQs}$!M@<$DESGZszR&4A z$j4QFUkkg_sfCGnbYZMF5#w0OeOzT7FI?!?&KzDEJ~1tL?t^1%(@*d{A6ILSyejup z^V;10&1A+0^>FijaYj|uGWgC5&^+T6ydWJ4vTvk&?TU;(` z8TyN_C)1WgL~=rQfC6<{k07ADQL*AwFLE_xSj1VT{JxeR?t$k0hs1B5oK7Js)-_Hzzx{CH;Q?6zg2;{W5_| zVJk;N<;?q1zly--^q>|$XJ5^^W0SG_<0ux=z1rwwb2twv=5p$##aohaf zKmY;|fB*y_009U<00izz00bza0sg_<0ux=z1rwwb2twv=5p$##aohafkmy;|fb*y_ z009U<00i!0@enno!puodhxw~5qdtgi@nlr-qfdq0d9t^pd-}-~z5(lndjmmpqdsly zo}_0;>)5399=)~O(A6eAA`_Qvd^*}|=$$DJw$f7?&vMhq4*vM^RY@UbWXE>1t>@3_ zULtRXQ}eY9uHcK2IxC)G#+CeO#gCXVQN8`|7RCJxpv=8F+nxZUlzEF)wnhxy%Ikby`>8y~kFVxfwj*U0-{bXY%*LzG%(cm^u-QvA zjp$U!r%|~b-=YaP{jMh$EY3UA>4wn31ED#I7hgX3=JGFS?%;wW&7XhOJm;h1pY;8j znYZ`-*N%P|?mYc_Th8WZsB&e?OjpMP~YGX_yqy|C;bGExCZ diff --git a/5-3testlisten b/5-3testlisten deleted file mode 100755 index d0936fd6f32d510850aeb5a33434c7361bec840f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50650 zcmeI5e{5UT700jbq;>i$ZrZh_zv8Sg`h(U9(5{81eO+7Hu+nBpk+N#*?Th^qn>e=d zdv2SO4v$c6Fp0$#AhaKaqG>c0)vAqcv8Jto!u~+h(ul28FrjqXM8ZIg#Dro*$1?K(H$%d{GMzw~NIQn}E2U|rTFp;FrTNC|oqWA&1p9^gyec0tw8hCM!$ve=Bq>sw z@B5pae5cfS_6zfgYw8P{Rx%Q6SK~|b)oyn3rBy%sg;JE8I;2d+4n<-i8hu&uznkNkDhd0gISTXhxjtp**|ufx7P)oL?q=t7HK#5?tt}<3hk~qp_c8w6+v5eto8)ip z@mO0lXTI{p6f*K>z%j0Cy?x&}4@Z=wOX?!u7R_n$b#cogWmK1DS7&QHDic;x)#dcr zziB7mfqaPk{9F!AC7s2F5-CHvrRP1)UtHgTw3E-PhOl3lZ*rz%N!e;n-rj5Tg=s!B zX1$)2#wWk`T@AaxzI|Im{#zYTIW(1pe3m!(<0l6vxC{4A&aa~}TtQz*PH@0a^{A7aWQl)^Px3)K@`wQ5b>8Y(K%YS+2GV0?LK1`#hF z-`r(dM(3KZsVSUQe1(+j@e@zxze4%Umt_el_Ya&WPIe(2g@6DEfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=9 z00@8p2!H?xfB*ATwF%Fr9FvtE~$V?EVVJ$`QM(*9>WOZ!juEEykm zrJLy8S#QmSb(u3lJl^No-@kdLxc^<3*n6ty+v9@fjv9~f(d&j2v`jkg88_^H%L$Hc%HXh%Z)4&v>xTC&~o3UF~b3owf&h|?kM}KL{_7D zHKY}!fA>_JKF;x*MRxRNExXwz?jQZ_(+gL)L{ozhU#)PS@AZmsea5c2yFT-5dAf-n zx%CDUn=-95_f${}o$FaTe$G=p-oSaw#fHm^w48gk$naVnG-f2AWktQHx`)@APc_k; z(fL}I#&!+Ux|eBxZg;wAANMb#T9#?qX(C;j-PzlP_C>`5W^4$slDS0A{mkM2rlz#}hyiRMjg z6+?8!+5B27n4wE-ptwE8?ynYIBh^~hDCvr$-Z{%_yepY!eoVFB^VeFRyG6LGFS6|` zu*WJV;};6-vjui2(0^3($kIgE`uk4{&ZXee%w&PqMx4qMaT^pUrf*dj9 z?}hCT$maK`3Wn>-zHmE_CLtx_t_l3OmZW(K_CrtC zdTxBS!%u1Mbr|HaQx?E=-_sM;@hdsrR>KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00jOo2+Uq4zQu)BX;Mnl(t{l`819hmDLoky z-$;sHEz}haQBSH>wnkzhgF-ysbY|$LX(TO~v|nRY8n3iFC8hMFiBxbeo%$?+!k@lEw zuh+<4)g!j<)xu6z*km@y3e`5wt)1utsq>|oV9GLN*wA@fHJy4SCT?=m7?1eqAa9c7 zql5irerkU~I?E-*3-y$O?3a}P7v*1M-z&s{wA24j_A7)4E1%O=x_tEO^v|A-eB$ z{KZb3huN}{ercUg{Ea34o)Z7w5?_}1Mu{IS@eh^w50?1fEAf9=;y+p9pD6LCkUy1_ zkcerd(@AHL&Lo{hT1m=uW|LNt5=t?L^nab_7xFr1EA6wT8(wf94IDOxDG2ocEpB#%-VX`ae2)*n8oQ=}S&%`)mH}>YDJq{OUbB-uJyaxZvoP J>fWB*e*m)NmS+F} diff --git a/5-5testaccept b/5-5testaccept deleted file mode 100755 index 74eb13970203ca79387f7ddc61c606a500df5d79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50698 zcmeI4e{56N700jb1e`!2KhWq%+L->BAQT+BGAJYPXow&SBUzG85raNn>=)uDv5ns| zBr9#brPWH;Zt=z>R*DKst0ft$vT9Oe2}&3fVw1Ku6F;hLY7O1AgtZcg{fLnu`=0ln z;pNe_Ql+Z><6pV`TRo!X4eQ-^NxD9+nhD9cUN%}rCMjs4QpF=6>gMP!Xu$g-|>>7>l&j5o5< ze3-w|!=RCGNpm1aBurs`%Ce@%TeKTP&Ui0Yn(_Lr73ACFd98S0Xf!jP+@^L!)fh&c z@z$+25<~3y6ドルG2boK=>S>7J89V`3~ zk4I~bCYk#!PfUZDm37clUSlvbj%_00$P2#FB(uxrm3?Me?oec{yR#+IAxHJt|BV+l zw+pH+iji&8A#UUhEz3bgSF*FW<`+$v`fx7+L~)H!rvR{pNfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaaj;`6V!U!aaKJ zvHXE+J?ZFvY6h+^mJ$`e~xL-

DZ{PmaSEp&;78X=bFnOE+5#lBTZ7xJHfcvbSd zo`zCCmIsuuNSGY_4qE4DDt}U+Q+AVbi51Mc&93pk7VN^ zx9(36>!BPgH^i#N{t?9PM1R5KN_vssSQT|=QLewSE| ztEf0Ha~&A;F1%csOc&F+}vz4)#QjrK8t&Ndnc>JXu3>vkCjQ?D0VjsciCCemx^xcw`_XIrh9EVYSZ;LU18G&Hhrnk7T>0a zY`WK`qn6%L=q@nwTYqeT`k~u|k#jw+O=c!1=hCkS>Hk2}T~X3kpzpTyCFrkO`U7ax zxUuFU^uw0^2efMGzd`S?^m*tfEd37j4=w!{=!2Gi8~RmCpMgGN=|4gL4mz$W+tro6 zdo^DuDl5TYOw}}BG!oP0aJ;icjpd6@B@`C^hcz{(`P<@3nq;mbhr7*|1xazyf%*t> zHL9_lYRnv1=3lmWnXYQO5(ubKeMul16NfC(@GCcp%k025#WOn?b60Vco%m;e)C z0!)AjFaajO1egF5U;<2l2`~xbzyz286jp>NfC(@GCcp%k025#WOn?b60Vco%m;e)C z0!)AjFaajO1egF5_>2i`!5>@TKSV^E)3ドルNDu=?k$exKF9Z1qD{f5hrfS^a6NPh0)_ zRzG3&pYh}J*E0bozyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1egF5U;<2l2`~xbzyz286jp>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1egF5_*@bwyjwg%i4{q*ENi+FXqN+R?eg}x5(|oN#6+(Y?CuC+Cf*{qgu+1;L$qEq zcPN^s#&kKRhcT>qjVNj?7NJ#Ifg@jQ9*NTIhU`F8j~KbsW1u6X>8jy1!;8j3VZD_WZ-b|G zsH(BEjhslJU8QXBX9%*6ドル>hn+O;)?qKwMYlHdUd=p5Lj2!s1>x)_BB7oFJf$#D{aK zKLMMCKT_zbH2+WG9Qj@$q6yQdZL?hk_%!`57(Vu|H2qR@oR%4_9G?hx!~e3wuXgy& z4u6}&Z*}-lhriR|Kko3Kari%W`1>7xpTi$?_^&zq9QXus8VuM(9xNX=12z+O8*CPA zHjF41!ir$iVa2ddy5A?{4>@buIBUESw)%!=R`!$^#i;2iBj&4AY zO4yV}@n*|5Td-ECW{dQe_feKNZ(Mr6T-VsRONrKm^`&3Y@leJxl>AObSHUOSuD&yK z1Z6c3KK<M|nxk@|lA;FmCocKi#xa;9ANeU|XI;w{FVj`}O)*~e znMIv%Jp0m%13#^L9B&=TIX61m z?yhUjo!tHF-QRxt&qu$%Vb6U(|G0U7ZQm;=4<9&vpla+~@qf>=w-n}`TJ`SME2o}% zq2NmD2inK&|Fq{koY;2c8RD{clXKo%Vdi)&~=wpKL2X`M{ahSB`($-!C5B mnI3)N==1koPS;gkefQDeu6s((bss(Q+xPysr{vA*t^Wh_hvLxy From 588e096c71ff1c9881005ed3baf06c341a3fb038 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: 2023年8月28日 21:38:51 +0800 Subject: [PATCH 4/6] [Learning] send(int sockfd, const void *buf, size_t len, int flags); recv(int sockfd, void *buf, size_t len, int flags); --- 5/5-6oobsend.cpp | 55 +++++++++++++++++--------------- 5/5-7oobrecv.cpp | 82 +++++++++++++++++++++++++++--------------------- 2 files changed, 76 insertions(+), 61 deletions(-) diff --git a/5/5-6oobsend.cpp b/5/5-6oobsend.cpp index 70fa13e..ed99244 100644 --- a/5/5-6oobsend.cpp +++ b/5/5-6oobsend.cpp @@ -6,39 +6,44 @@ #include #include #include +#include -int main( int argc, char* argv[] ) -{ - if( argc <= 2 ) - { - printf( "usage: %s ip_address port_number\n", basename( argv[0] ) ); + +/** + * ssize_t send(int sockfd, const void *buf, size_t len, int flags); + * + * 启动 5-7 后启动 5-6 + */ +int main(int argc, char *argv[]) { + if (argc <= 2) { + printf("usage: %s ip_address port_number\n", basename(argv[0])); return 1; } - const char* ip = argv[1]; - int port = atoi( argv[2] ); + const char *ip = argv[1]; + int port = atoi(argv[2]); struct sockaddr_in server_address; - bzero( &server_address, sizeof( server_address ) ); + bzero(&server_address, sizeof(server_address)); server_address.sin_family = AF_INET; - inet_pton( AF_INET, ip, &server_address.sin_addr ); - server_address.sin_port = htons( port ); + inet_pton(AF_INET, ip, &server_address.sin_addr); + server_address.sin_port = htons(port); - int sockfd = socket( PF_INET, SOCK_STREAM, 0 ); - assert( sockfd>= 0 ); - if ( connect( sockfd, ( struct sockaddr* )&server_address, sizeof( server_address ) ) < 0 ) - { - printf( "connection failed\n" ); - } - else - { - printf( "send oob data out\n" ); - const char* oob_data = "abc"; - const char* normal_data = "123"; - send( sockfd, normal_data, strlen( normal_data ), 0 ); - send( sockfd, oob_data, strlen( oob_data ), MSG_OOB ); - send( sockfd, normal_data, strlen( normal_data ), 0 ); + int sockfd = socket(PF_INET, SOCK_STREAM, 0); + assert(sockfd>= 0); + if (connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) { + printf("connection failed\n"); + } else { + printf("send oob data out\n"); + const char *oob_data = "abc"; + const char *normal_data = "123"; + send(sockfd, normal_data, strlen(normal_data), 0); + // 使用了 MSG_OOB 标志。MSG_OOB 标志表示发送紧急(out-of-band)数据。 + // 紧急数据是一种特殊的数据,通常用于在普通数据流中插入重要的消息。 + // 这里,紧急数据 "abc" 被发送到服务器。 + send(sockfd, oob_data, strlen(oob_data), MSG_OOB); + send(sockfd, normal_data, strlen(normal_data), 0); } - close( sockfd ); + close(sockfd); return 0; } diff --git a/5/5-7oobrecv.cpp b/5/5-7oobrecv.cpp index cd0b070..a63a2a5 100644 --- a/5/5-7oobrecv.cpp +++ b/5/5-7oobrecv.cpp @@ -7,61 +7,71 @@ #include #include #include +#include #define BUF_SIZE 1024 -int main( int argc, char* argv[] ) -{ - if( argc <= 2 ) - { - printf( "usage: %s ip_address port_number\n", basename( argv[0] ) ); +/** + * ssize_t recv(int sockfd, void *buf, size_t len, int flags); + * + * 启动 5-7 后启动 5-6 : + * + * got 5 bytes of normal data '123ab' + * + * got 1 bytes of oob data 'c' 只有 c 被当成外带数据 + * + * got 3 bytes of normal data '123' + * + * 服务器对正常数据的接收将被带外数据截断,即前一部分正常数据"123ab"和后续的正常数据"123"是不能被一个recv调用全部读出的。 + */ + +int main(int argc, char *argv[]) { + if (argc <= 2) { + printf("usage: %s ip_address port_number\n", basename(argv[0])); return 1; } - const char* ip = argv[1]; - int port = atoi( argv[2] ); + const char *ip = argv[1]; + int port = atoi(argv[2]); struct sockaddr_in address; - bzero( &address, sizeof( address ) ); + bzero(&address, sizeof(address)); address.sin_family = AF_INET; - inet_pton( AF_INET, ip, &address.sin_addr ); - address.sin_port = htons( port ); + inet_pton(AF_INET, ip, &address.sin_addr); + address.sin_port = htons(port); - int sock = socket( PF_INET, SOCK_STREAM, 0 ); - assert( sock>= 0 ); + int sock = socket(PF_INET, SOCK_STREAM, 0); + assert(sock>= 0); - int ret = bind( sock, ( struct sockaddr* )&address, sizeof( address ) ); - assert( ret != -1 ); + int ret = bind(sock, (struct sockaddr *) &address, sizeof(address)); + assert(ret != -1); - ret = listen( sock, 5 ); - assert( ret != -1 ); + ret = listen(sock, 5); + assert(ret != -1); struct sockaddr_in client; - socklen_t client_addrlength = sizeof( client ); - int connfd = accept( sock, ( struct sockaddr* )&client, &client_addrlength ); - if ( connfd < 0 ) - { - printf( "errno is: %d\n", errno ); - } - else - { - char buffer[ BUF_SIZE ]; + socklen_t client_addrlength = sizeof(client); + int connfd = accept(sock, (struct sockaddr *) &client, &client_addrlength); + if (connfd < 0) { + printf("errno is: %d\n", errno); + } else { + char buffer[BUF_SIZE]; - memset( buffer, '0円', BUF_SIZE ); - ret = recv( connfd, buffer, BUF_SIZE-1, 0 ); - printf( "got %d bytes of normal data '%s'\n", ret, buffer ); + memset(buffer, '0円', BUF_SIZE); + ret = recv(connfd, buffer, BUF_SIZE - 1, 0); + printf("got %d bytes of normal data '%s'\n", ret, buffer); - memset( buffer, '0円', BUF_SIZE ); - ret = recv( connfd, buffer, BUF_SIZE-1, MSG_OOB ); - printf( "got %d bytes of oob data '%s'\n", ret, buffer ); + memset(buffer, '0円', BUF_SIZE); + ret = recv(connfd, buffer, BUF_SIZE - 1, MSG_OOB); + printf("got %d bytes of oob data '%s'\n", ret, buffer); - memset( buffer, '0円', BUF_SIZE ); - ret = recv( connfd, buffer, BUF_SIZE-1, 0 ); - printf( "got %d bytes of normal data '%s'\n", ret, buffer ); + memset(buffer, '0円', BUF_SIZE); + ret = recv(connfd, buffer, BUF_SIZE - 1, 0); + printf("got %d bytes of normal data '%s'\n", ret, buffer); - close( connfd ); + close(connfd); } - close( sock ); + close(sock); return 0; } From 1df608f618e5665ffe842c6eb142814d961d3d77 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: Fri, 1 Sep 2023 23:19:26 +0800 Subject: [PATCH 5/6] byteOrder --- 5/5-1byteorder.cpp | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/5/5-1byteorder.cpp b/5/5-1byteorder.cpp index 549655d..1ccfebf 100644 --- a/5/5-1byteorder.cpp +++ b/5/5-1byteorder.cpp @@ -1,22 +1,16 @@ #include -void byteorder() -{ - union - { - short value; - char union_bytes[ sizeof( short ) ]; - } test; - test.value = 0x0102; - if ( ( test.union_bytes[ 0 ] == 1 ) && ( test.union_bytes[ 1 ] == 2 ) ) - { - printf( "big endian\n" ); - } - else if ( ( test.union_bytes[ 0 ] == 2 ) && ( test.union_bytes[ 1 ] == 1 ) ) - { - printf( "little endian\n" ); - } - else - { - printf( "unknown...\n" ); - } + +void byteorder() { + union { + short value; + char union_bytes[sizeof(short)]; + } test; + test.value = 0x0102; + if ((test.union_bytes[0] == 1) && (test.union_bytes[1] == 2)) { + printf("big endian\n"); + } else if ((test.union_bytes[0] == 2) && (test.union_bytes[1] == 1)) { + printf("little endian\n"); + } else { + printf("unknown...\n"); + } } \ No newline at end of file From 44d52fec7e7c3f7a11b482c7d9950c852fb3ac65 Mon Sep 17 00:00:00 2001 From: huaisui <498685034@qq.com> Date: Tue, 5 Sep 2023 21:41:31 +0800 Subject: [PATCH 6/6] [Learning] recv --- 5/5-7oobrecv.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/5/5-7oobrecv.cpp b/5/5-7oobrecv.cpp index a63a2a5..4d87de6 100644 --- a/5/5-7oobrecv.cpp +++ b/5/5-7oobrecv.cpp @@ -13,6 +13,9 @@ /** * ssize_t recv(int sockfd, void *buf, size_t len, int flags); + * 返回值:> 0 接收到的数据大小; + * == 0 另一端关闭了 socket; + * == -1 错误 * * 启动 5-7 后启动 5-6 : *

AltStyle によって変換されたページ (->オリジナル) /