簡體   English   中英

使用UDP傳輸映像

[英]Using UDP transfer image

我一直在研究如何在C中使用UDP傳輸圖像,我創建了一個有時有效的代碼,有時卻無效。 我認為問題在於,有時服務器接收的軟件包多於寫入的軟件包。 我知道我正在嘗試創建TCP,但這就是我想要的,但是不確定如何執行。

我認為要解決此問題,客戶端應發送img的buff,並且僅在服務器回復給客戶端時才發送第二部分。

這是代碼:

客戶:

while (!feof(p))
    {
            fread(*&c, 1, BLEN, p);
            sprintf(buf, "%s", *&c);
            temp=sendto(s,buf,BLEN, 0, (struct sockaddr *) &si_other, slen);
            //sleep(3);
            //printf("%d ",temp);
            if(temp < 0)
            {
                    fprintf(stderr,"sendto error.\n");
                    printf("erro");
                    exit(1);
            }
            i++;
    }

服務器:

while(1){
    if(recvfrom(s, buf, BLEN, 0, (struct sockaddr *) &si_other, (unsigned int *) &slen)==-1){
        perror("recvfrom error.\n");
        exit(1);
    }
    //printf("%s ", &si_other);
    flagr[0] = buf[0];
    flagr[1] = buf[1];
    flagr[2] = buf[2];
    if (strcmp(flagr, flag) == 0 ){
            break;
    }
    fwrite(buf, 1, BLEN, pp);
    i++;
}

UDP是一種數據報協議,這意味着sendto每個調用都發送一個消息。 如果該消息大於IP數據包可以容納的消息,則它將在多個IP數據報之間分段。 如果這些片段中的任何一個都無法到達,則整個片段將落入OS級別。

數據需要以不超過約1450字節的塊的形式發送。 然后,接收方將需要讀取每個數據包,並且由於UDP不保證數據將按順序到達,因此您將需要按正確的順序重新組裝它們。

這意味着每個數據包必須具有用戶定義的報頭,其中包含序列號,以便接收方知道將其放入的順序。

您還需要擔心重傳,因為UDP不能保證發送的數據包實際上已被接收。

我寫了一個名為UFTP的程序來完成所有這些工作。 查看文檔和代碼,以了解實現基於UDP的可靠數據傳輸所需執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM