<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
UDP 不提供可靠性的傳輸,它只是把應用程式傳給 IP 層的資料包傳送出去,但是並不能保證它們能到達目的地。
由於 UDP 在傳輸資料包前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。
UDP發出的封包不經過確認,可以繼續傳送。傳送成功與否都不管,盡最大能力去傳送,丟包也不負責。有自己的使用特點:適合於做視訊(實時性)適合於即使丟包了,處理起來也比較方便。
適合於攝像頭以恆定速率發,對方以恆定速率收,丟包了繼續發,可以實時。
但是如果是TCP,如果丟包,會重發,時間花銷大了,不能實時。不適合做攝像頭和視訊。
接收
int recvfrom(int sockfd,void *buf,size_t size,int flag,struct sockaddr *peer_addr,socklen_t *addr_len);
peer_addr
:用來儲存recvfrom接收到的資料是來自哪臺主機的地址資訊addr_len
:地址結構的長度傳送
int sendto(int sockfd,void *buf,size_t size,int flag,struct sockaddr *peer_addr,socklen_t addr_len);
peer_addr
:用來指定資料的接收方的地址資訊addr_len
:地址資訊的長度範例程式碼
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<sys/types.h> #include<arpa/inet.h> #include<netinet/in.h> int main() { //SOCK_DGRAM表示使用的是UDP協定 int sockfd = socket(AF_INET,SOCK_DGRAM,0); assert(sockfd != -1); struct sockaddr_in ser_addr; memset(&ser_addr,0,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; //將主機位元組序轉化為網路位元組序 ser_addr.sin_port = htons(6000); //將點分十進位制的地址字串轉為unit32型別的值 ser_addr.sin_addr.s_addr = inet_addr("192.168.246.128"); int res = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr)); assert(res != -1); //迴圈接受不同使用者端的資料 while(1) { char buff[128] = {0}; struct sockaddr_in cli_addr; socklen_t cli_len = sizeof(cli_addr); int n = recvfrom(sockfd,buff,127,0,(struct sockaddr*)&cli_addr,&cli_len); if(n <= 0) { break; } printf("%s:%d -- %sn",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buff); n = sendto(sockfd,"OK",2,0,(struct sockaddr*)&cli_addr,cli_len); if(n <= 0) { break; } } close(sockfd); exit(0); }
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<sys/types.h> #include<arpa/inet.h> #include<netinet/in.h> int main() { int sockfd = socket(AF_INET,SOCK_DGRAM,0); assert(sockfd != -1); struct sockaddr_in ser_addr; memset(&ser_addr,0,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(6000); ser_addr.sin_addr.s_addr = inet_addr("192.168.246.128"); while(1) { printf("請輸入:"); char buff[128] = {0}; fgets(buff,127,stdin); if(strncmp(buff,"end",3) == 0) { break; } int n = sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr)); if(n <= 0) { break; } memset(buff,0,128); int m = recvfrom(sockfd,buff,127,0,NULL,NULL);//伺服器地址資訊已知,無需儲存直接傳入NULL if(m <= 0) { break; } printf("%sn",buff); } close(sockfd); exit(0); }
兩個使用者端同時向伺服器端傳送資訊
多個使用者端可以和伺服器一起連結通訊。recvfrom並不是只等第一個或者第二個使用者端,而是誰給它發,它就收誰的。
如果在使用者端保持執行狀態的情況下,將伺服器端關閉,然後再把伺服器端重新執行起來,這時候使用者端傳送資料,伺服器端是可以收到的。
因為UDP本來就沒有建立連線。如果伺服器端關了,使用者端send就失敗了。 封包丟了就丟了,不會理會。不管關閉哪一端,對方端都不知道這件事情,彼此無關係,無影響。
如果讓伺服器端一次只接受一個字元,我給你發一個封包,你去收這個封包,你recvfrom,你把這個封包拆開,你讀取1個字元,後面的不讀,直接就丟掉了。
UDP的報頭固定是8個位元組!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45