当前位置: 首页 > Linux

《Linux网络开发必学教程》17_深入UDP数据收发(下)

时间:2023-04-06 18:53:35 Linux

闂細UDP杩樻湁鍏朵粬涓€瀵瑰鐨勬暟鎹彂閫佹柟寮忓悧锛烾DP閫氫俊涓殑缁勬挱鏄竴绉嶅悜鐗瑰畾缁勪腑鐨勬墍鏈変富鏈轰紶杈撴暟鎹殑鏂规硶銆傜粍鎾篃绉颁负缁勬挱銆傜粍鎾暟鎹紶杈撶殑鐗圭偣锛氱粍鎾彂閫佽€呭彧鍚戠壒瀹氱殑缁勬挱缁勫彂閫?銆傜粍鍐呯殑涓绘満鍙互鎺ユ敹鏁版嵁锛岀粍鍐呯殑涓绘満鍙互閫氳繃鍔犲叆鐗瑰畾鐨勭粍鏉ユ帴鏀剁粍鍐呯殑缁勬挱鏁版嵁銆傚湪IP鍦板潃鑼冨洿鍐呭彲浠ヤ换鎰忔坊鍔犵粍鎾粍銆侱绫诲湴鍧€锛?24.0.0.0-239.255.255.255锛夆€滃姞鍏ョ粍鎾粍鈥濆彲浠ョ悊瑙d负UDP缃戠粶绋嬪簭鎵€鍋氱殑鐢宠锛屽锛氱敵璇锋帴鏀跺彂寰€239.234.111.222鐨勭粍鎾暟鎹紝鍗筹細璁剧疆灞炴€?IPPROTO_IP,IP_ADD_MEMBERSHP)鍙戦€佺粍鎾暟鎹殑鏂规硶涓庡彂閫佹櫘閫歎DP鏁版嵁鐩稿悓銆傚垵姝ユ搷浣滐細璁剧疆灞炴€э紝濡傦細(IPPROTO_IP,IP_MULTICAST_TTL)娉ㄦ剰浜嬮」鍔犲叆鍚屼竴涓鎾粍鐨勪富鏈轰笉涓€瀹氬湪鍚屼竴涓綉缁溿€傚洜姝わ紝缁勬挱蹇呴』璁剧疆鏈€澶ф暟鎹浆鍙戞鏁帮紙TTL锛塗TL锛堝嵆锛歍imeToLive锛夋槸鍐冲畾鏁版嵁浼犺緭璺濈鐨勪富瑕佸洜绱犮€俆TL鐢ㄦ暣鏁拌〃绀猴紝姣忕粡杩囦竴鏉¤矾鐢卞氨鍑?銆傚綋TTL鍙樹负0鏃讹紝鏁版嵁鏃犳硶缁х画浼犺緭銆傚彧鑳界牬鍧忕粍鎾紪绋嬶細senderIP_MULTCAST_TTL锛氱敤浜庤缃粍鎾暟鎹殑鈥滄渶闀夸紶杈撹窛绂烩€濓紝榛樿1IP_MULTICAST_IF锛氱敤浜庤缃粠鍝釜缃戠粶鎺ュ彛锛堢綉鍗★級鍙戦€佺粍鎾暟鎹紝榛樿锛?.0.0.0Default0.0.0.0鍦ㄦ搷浣滅郴缁熺殑鎯呭喌涓嬩細閫夋嫨浣跨敤鍝釜缃戠粶鎺ュ彛锛屼絾鏄湪銆愬缃戝崱涓绘満銆戠殑銆愬疄闄呭伐绋嬪簲鐢ㄣ€戜腑锛屾渶濂芥墜鍔ㄦ寚瀹氾紒锛両P_MULTCAST_LOOP锛氱敤浜庤缃槸鍚﹀皢缁勬挱鏁版嵁鍙戝洖鏈満锛岄粯璁?锛?锛屽彂鍥炴湰鏈猴級remote.sin_family=AF_INET;remote.sin_addr.s_addr=inet_addr("224.1.1.168");remote.sin_port=htons(8888);setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));鍋歿len=sizeof(杩滅▼);r=鍙戦€佸埌锛堟墍浠k,buf,strlen(buf),0,(structsockaddr*)&remote,len);鐫$湢锛?锛夛紱}鑰岋紙r>0锛夛紱缁勬挱缂栫▼锛氭帴鏀惰€匢P_ADD_MEMBRESHIP锛氱敤浜庣敵璇峰姞鍏ヤ竴涓粍鎾粍锛屽弬鏁颁负锛氱粍鎾粍鍜屾湰鍦板湴鍧€structip_mreq{//缁勫湴鍧€structin_addrinmr_multiaddr;//鏈湴涓绘満鍦板潃structin_addrimr_interface}馃憞structip_mreqgroup={0};group.imr_multiaddr.s_addr=inet_addr("224.1.1.168");group.imr_interface.s_addr=htonl(INADDR_ANY);//鐩戞帶鎵€鏈夌綉鍗etsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group));鍋歿len=sizeof(杩滅▼);r=recvfrom(sock,buf,sizeof(buf),0,(structsockaddr*)&remote,&len);缂撳啿鍖篬r]=0;printf("r=%d\n",r);printf("msg=%s\n",buf);}while(r>0)閫€鍑哄鎾粍quit=setsockopt(sock,IP_PROTO_IP,IP_DROP_MEMBERSHIP,&group,sizeof(group));if(quit==0){break;}缂栫▼瀹為獙锛歎DP缁勬挱缂栫▼mul_tx.c#include#include#include#include#include#include#includeintmain(){intsock=0;缁撴瀯sockaddr_in杩滅▼={0};socklen_tlen=0;charbuf[128]="D.T.Software";缁撴瀯in_addr鍦板潃={0};intttl=0;鏁存暟寰幆=0锛泂ock=socket(PF_INET,SOCK_DGRAM,0);if(sock==-1){printf("濂楁帴瀛楅敊璇痋n");杩斿洖-1锛泒remote.sin_family=AF_INET;remote.sin_addr.s_addr=inet_addr("224.1.1.168");remote.sin_port=htons(8888);//------------------------ttl=0;len=sizeof(ttl);getsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,&len);//鍙互涓嶈缃紝ttl榛樿涓?printf("defaultttl=%d\n",ttl);ttl=32;len=sizeof(ttl);setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,len);printf("褰撳墠ttl=%d\n",ttl);寰幆=0锛沴en=sizeof(寰幆);getsockopt锛堣瀛愶紝IPPROTO_IP锛孖P_MULTICAST_LOOP,&loop,&len);//涓嶈兘璁剧疆锛宼tl榛樿涓?锛屽嵆鏈満涔熶細鏀跺埌printf("defaultloop=%d\n",loop);//addr.s_addr=inet_addr("192.168.3.221");//鍏蜂綋鎸囧畾浣跨敤鍝釜缃戝崱杩涜鏁版嵁骞挎挱addr.s_addr=htonl(INADDR_ANY);//璁╂搷浣滅郴缁熼€夋嫨len=sizeof(addr);setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&addr,len);//涓嶅彲璁剧疆锛岄粯璁や负INADDR_ANY锛屽嵆"0.0.0.0"锛岀敱鎿嶄綔绯荤粺閫夋嫨浣跨敤鍝釜缃戝崱printf("currentif=%s\n",inet_ntoa(addr));//褰撲富鏈烘湁澶氫釜缃戝崱鏃讹紝鍦ㄥ疄闄呴」鐩腑浣跨敤鏃讹紝鏈€濂芥墜鍔ㄦ寚瀹氫娇鐢ㄥ摢涓綉鍗″箍鎾暟鎹?/--------------------------while(1){len=sizeof(remote);sendto(sock,buf,strlen(buf),0,(structsockaddr*)&remote,len);鐫¤锛?锛夛紱}鍏抽棴锛堣瀛愶級锛涜繑鍥?;}mul_rx.c#include#include#include#include#include#include#includeintmain(){intserver=0;缁撴瀯sockaddr_insaddr={0};缁撴瀯sockaddr_in杩滅▼={0};缁撴瀯ip_mreq缁?{0};int闀垮害=0;瀛楃buf[32]={0};鏁存暟r=0;鏈嶅姟鍣?濂楁帴瀛楋紙PF_INET锛孲OCK_DGRAM锛?锛夛紱if(server==-1){printf("鏈嶅姟鍣ㄥ鎺ュ瓧閿欒");杩斿洖-1锛泒saddr.sin_family=AF_INET;saddr.sin_addr.s_addr=htonl(INADDR_ANY);saddr.sin_port=htons(8888);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("udp鏈嶅姟鍣ㄧ粦瀹氶敊璇痋n");杩斿洖-1锛泒printf("udp鏈嶅姟鍣ㄥ惎鍔ㄦ垚鍔焅n");group.imr_multiaddr.s_addr=inet_addr("224.1.1.168");group.imr_interface.s_addr=htonl(INADDR_ANY);setsockopt(server,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group));while(1){len=sizeof(杩滅▼);r=recvfrom(server,buf,sizeof(buf),0,(structsockaddr*)&remote,&len);濡傛灉锛坮>0锛墈缂撳啿鍖篬r]=0;printf("鎺ユ敹:%s\n",buf);}else{浼戞伅;}}鍏抽棴锛堟湇鍔″櫒锛夛紱return0;}鎬荤粨Unicast锛氫竴瀵逛竴鐨勬暟鎹紶杈擄紝鍗筹細鎸囧畾鍙戦€佹暟鎹箍鎾殑鐩爣涓绘満锛堝繀椤诲湪鍚屼竴涓眬鍩熺綉鍐咃級Localbroadcast锛氭湰鍦板眬鍩熺綉骞挎挱鏁版嵁锛屾墍鏈変富鏈洪兘鍙互鎺ユ敹鏁版嵁Directbroadcast锛氭寚瀹氱綉缁滃箍鎾暟鎹紝鐩爣缃戠粶鍐呯殑涓绘満鍙互鎺ユ敹鏁版嵁

最新推荐
猜你喜欢