ubuntu 虚拟机 串口 socket_上篇 | 虚拟机Ubuntu向开发板AMR传送文件
生活随笔
收集整理的這篇文章主要介紹了
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传送文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多帧点云数据拼接合并_PCL点云处理实践
- 下一篇: comparator 字符串比较大小_J