Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

我不確定這是否為問題點 #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

bdvstg
Copy link

@bdvstg bdvstg commented Apr 14, 2020

我沒有編譯過,只是依照經驗判斷哪邊有可能有問題

sendfile有可能實際送出的資料少於block_size
因此img_total_size減掉block_size會有問題的

詳細請看sendfile的說明(你註解中的連結)的回傳值的部分

and I have not compile it
@Dungyichao
Copy link
Owner

Dungyichao commented Apr 14, 2020

感謝提點,照你的方式更改好code,有看到在傳送特定幾張圖片時會出錯誤: Bad file descriptor
在其他電腦跑就可以,Raspberry pi就會錯誤,我得深入找下問題點~感謝

int send_message(int fd, char image_path[], char head[]){
    /*
    char imageheader[] = 
    "HTTP/1.1 200 Ok\r\n"
    "Content-Type: image/jpeg\r\n\r\n";
    */
    struct stat stat_buf;  /* hold information about input file */

    write(fd, head, strlen(head));

    int fdimg = open(image_path, O_RDONLY);
     
    fstat(fdimg, &stat_buf);
    int img_total_size = stat_buf.st_size;
    int block_size = stat_buf.st_blksize;
    //printf("image block size: %d\n", stat_buf.st_blksize);  
    //printf("image total byte st_size: %d\n", stat_buf.st_size);
    
    ssize_t sent_size;

    while(img_total_size > 0){
        if(img_total_size < block_size){
            sent_size = sendfile(fd, fdimg, NULL, img_total_size);
        }
        else{
            sent_size = sendfile(fd, fdimg, NULL, block_size);
        }       
        img_total_size = img_total_size - sent_size;
        
        if(sent_size < 0){
            printf("send file error --> send size: %d , error: %s\n", sent_size, strerror(errno));
            img_total_size = -1;
        }
    }
    if(sent_size < 1){
        
    }
    else{
        printf("send file: %s \n" , image_path);
    }
    close(fdimg);
}

@Dungyichao
Copy link
Owner

我檢查文件的權限 ($ ls -l 指令)
----以下是以下是可以傳送的圖片的權限
-rw-r--r-- 1 pi pi 75609 Jan 1 18:10 duck-full.jpg
-rw-r--r-- 1 pi pi 145423 Jan 10 09:53 fish.jpg
-rw-r--r-- 1 pi pi 102816 Jan 1 17:07 five-color-full.JPG
-rw-r--r-- 1 pi pi 92390 Jan 1 16:51 five-color.jpg
-rw-r--r-- 1 pi pi 96327 Jan 6 14:48 kale.JPG
-rw-r--r-- 1 pi pi 123816 Jan 6 15:48 lobsalad.jpg
-rw-r--r-- 1 pi pi 66817 Jan 4 16:47 sea.JPG
-rw-r--r-- 1 pi pi 270336 Jan 10 09:54 Thumbs.db

----以下是以下是不可以傳送的圖片的權限(會卡在4.bmp那張圖片,其餘的圖片根本沒被client的browser 請求 GET)
-rw-r--r-- 1 pi pi 0 Apr 8 20:29 4.bmp
-rw-r--r-- 1 pi pi 23088 Apr 8 19:23 4.jpg
-rw-r--r-- 1 pi pi 67924 Apr 8 19:23 andy.jpg
-rw-r--r-- 1 pi pi 67373 Apr 8 19:24 david.jpg
-rw-r--r-- 1 pi pi 88352 Apr 8 19:24 frank.jpg
-rw-r--r-- 1 pi pi 73190 Apr 8 19:24 liao1.jpg
-rw-r--r-- 1 pi pi 75418 Apr 8 19:24 lin.jpg
-rw-r--r-- 1 pi pi 66359 Apr 8 19:25 paul.jpg
-rw-r--r-- 1 pi pi 61440 Jan 8 12:21 Thumbs.db

@bdvstg
Copy link
Author

bdvstg commented Apr 21, 2020

我覺得你可以先釐清是你程式問題,還是系統問題

  1. 你可以cat 4.bmp看會不會有東西出來
  2. 裝個簡易的 http server (推薦python) 看可不可以在client端把4.bmp下載或開啟
    (https://dotblogs.com.tw/Funny_DotBlog/2019/05/16/python_webserver)

以上兩個都沒問題的話,那也許應該是程式問題比較有可能

另外我在PTT上要你檢查fdimg的值其實有要你處裡他的意思
因為當fdimg為-1時你後面的程式碼都是會出問題的(像是fstat和sendfile和close)
以http server來說,你應該要回傳個 404 Not Found 之類的
(https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Status)  
而不是繼續跑後面的程式碼

還有就是http://man7.org/linux/man-pages/man2/open.2.html
參考 "RETURN VALUE" 的部分
"當回傳值為 -1 時,表示錯誤發生,此時,errno (error code)會被設定"
這時候你可以透過errno得到更多的錯誤資訊
https://stackoverflow.com/questions/503878/how-to-know-what-the-errno-means
http://man7.org/linux/man-pages/man3/errno.3.html 

@bdvstg
Copy link
Author

bdvstg commented Apr 21, 2020

我剛剛又粗略看了你的程式碼
你程式碼的header我沒看到bmp的存在
只有image/jpeg和image/vnd.microsoft.icon

讀bmp時,回傳jpeg的header,應該會有問題

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img

@bdvstg
Copy link
Author

bdvstg commented Apr 21, 2020

又發現你4.bmp的檔案大小根本是 0 bytes
應該是檔案損毀吧?

@Dungyichao
Copy link
Owner

Dungyichao commented Apr 21, 2020 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants