日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

ubuntu 虚拟机 串口 socket_上篇 | 虚拟机Ubuntu向开发板AMR传送文件

發布時間:2024/7/23 Ubuntu 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ubuntu 虚拟机 串口 socket_上篇 | 虚拟机Ubuntu向开发板AMR传送文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讓技術·支撐夢想

點擊上方藍字可以關注我們哦

首先把Ubuntu向開發板發送文件的流程做一下筆記,下一篇筆記就記錄開發板如何接受文件....

上一篇筆記:Makefile文件的編寫規則及實例

有很多小伙伴看不懂術語,所以這次小浩用口語方式表達這次筆記,可能表達能力欠佳,多多包涵。

1.說一下環境,虛擬機和開發板要在同一個局域網同一網段,而小浩這次用的是UDP協議來收發消息的,雖然說UDP不可靠,不穩定,在數據傳遞時,如果網絡質量不好,就會很容易丟包,但UDP就是比TCP傳輸速度快,天下武功唯快不破.

2. 接下來,進入主題吧

????a.創建一個UDP通信端點,?即socket();

????b.準備好開發板的IP地址和端口號c.?然后把IPV4、端口號、IP地址放進sockaddr_in結構體,該結構體是系統封裝的一個結構體

????d.然后選擇要發給開發板的文件

????e.獲取文件屬性并發給開發板,則等待開發板回應

????f.獲得開發板允許后,把文件發給開發板

????g.最后傳輸完畢,提示虛擬機發送成功

這個發送文件流程就是這么簡單啦!!!

3.接下來我們看看代碼,來看看我們實現的現場

/*
公眾號:小浩筆記
備注:小浩除去頭文件,減短篇幅,方便閱讀
*/

//創建套接字函數
int?Socket(int?domain, int?type, int?protocol){
????int?sockfd = socket(domain, type, protocol);
????if(sockfd == -1)
????{
????????perror("創建UDP套接字失敗");
????????exit(0);
????}

????return?sockfd;
}

//綁定地址的函數
int?Bind(int?sockfd, const?struct sockaddr *addr,socklen_t?addrlen){
????if(bind(sockfd, addr, addrlen) == -1)
????{
????????perror("綁定地址失敗");
????????exit(0);
????}
????return?0;
}

//udp連接的函數
int?Connect(int?sockfd, const?struct sockaddr *addr,socklen_t?addrlen){
????int?ret = connect(sockfd, addr, addrlen);
????if(ret != 0)
????{
????????perror("連接失敗");
????????exit(0);
????}
????return?ret;
}
//讀文件函數
void?readfile(char?*content, const?char?*filename, int?size){
????int?fd = open(filename, O_RDONLY);
????if(fd == -1)
????{
????????perror("文件無法打開");
????????exit(0);
????}

????int?total = 0;
????while(total < size)
????{
????????int?n = read(fd, content+total, size);
????????if(n == -1)
????????{
????????????perror("讀取文件失敗");
????????????exit(0);
????????}

????????total += n;
????}

????close(fd);
}



int?main(int?argc, char?**argv){
????if(argc != 3)
????{
????????printf("參數錯誤!用法:\n");
????????exit(0);
????}

????// 1,創建UDP通信端點
????int?sockfd = Socket(AF_INET, SOCK_DGRAM, 0);

????// 2,準備開發板的地址(IP+PORT)
????struct?sockaddr_in?addr;
????socklen_t?len = sizeof(addr);
????bzero(&addr, len);

????addr.sin_family = AF_INET; // 指定協議族,這里是IPv4地址
????addr.sin_addr.s_addr = inet_addr(argv[1]); // IP地址
????addr.sin_port = htons(atoi(argv[2])); // PORT端口號

????// 3,選擇要發送給開發板的文件
????char?filename[50];
????bzero(filename, 50);
????gets (filename);

????// 4,獲取文件屬性信息并發送給開發板
????struct?stat?info;
????bzero(&info, sizeof(info));
????stat(filename, &info);

????struct?fileinfo?finfo;
????bzero(&finfo, sizeof(finfo));
????strncpy(finfo.name, filename, 50);
????finfo.size = info.st_size;

????printf("名字:%s\n大小:%d\n", finfo.name, finfo.size);
????int?n = sendto(sockfd, &finfo, sizeof(finfo), 0,
???????????????????(struct sockaddr *)&addr, len);
????if(n > 0)
????????printf("發送文件屬性信息成功,發了%d個字節\n", n);
????else
????{
????????perror("發送文件屬性信息失敗");
????????exit(0);
????}

????// 5,等待開發板的確認
????char?response;
????recvfrom(sockfd, &response, 1, 0, NULL, NULL);
????if(response == 'n')
????????return?0;

????// 6,將文件內容放入content中
????char?*content = calloc(1, finfo.size);
????readfile(content, finfo.name, finfo.size);

????// 7,開始給開發板發送文件的內容
????int?total = 0;
????while(total < finfo.size)
????{
????????int?remain = finfo.size-total;
????????int?m = remain>1024?? 1024?: remain;

????????// 每次最多發1k數據量
????????total += sendto(sockfd, content+total, m, 0,
????????????????????????(struct sockaddr *)&addr, len);
????}

????printf("發送完畢\n");
????close(sockfd);

????return?0;
}

記錄點點滴滴的筆記歡迎關注,共同學習

小浩筆記

總結

以上是生活随笔為你收集整理的ubuntu 虚拟机 串口 socket_上篇 | 虚拟机Ubuntu向开发板AMR传送文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。