[英]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.