2011-10-18 320 views
1

我正在嘗試使用UDP來實現基本的文件傳輸協議。 我使用Beej's Guide作爲參考,我將發佈的大部分代碼都是從那裏發佈的。雙向UDP客戶端和服務器?

我的程序到目前爲止都有'講話者'發送它想要的'接收'文件的名稱。

從那裏,接收器檢查文件是否存在,如果存在,它會計算出文件的大小。

現在,這裏是我遇到問題的地方。我需要接收器將文件的大小發送給發言者。你可以在我的代碼(下面的鏈接)中看到我是如何實現它的。然而,談話者只是掛起,就像仍在等待發送內容。

這讓我覺得接收者需要一些額外的代碼來允許它與講話者進行通信,而不僅僅是從它接收數據(我習慣了TCP,所以原諒我缺乏知識)。

有人能告訴我我缺少什麼代碼,或者如果我使用的功能錯誤? Beej的指導很難遵守,他沒有提供雙向交流的例子。

謝謝,讓我知道如果你需要任何更多的信息。


監聽器:http://pastebin.com/UL1xjDnP

發話:http://pastebin.com/B2zrXPgZ


編輯:解決了! 感謝cnicutar,

我解決了服務器在這段代碼的時候我應該已經解決了客戶端

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, p->ai_addr, p->ai_addrlen)) == -1)

應改爲

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)

+0

就是「監聽器」報告「監聽器:文件大小已發送」? – cnicutar

+0

我想知道爲什麼UDP? TCP是一個更好的傳輸文件的協議。 UDP不提供諸如順序傳送,重新發送損壞的數據等等,這些在傳輸文件時是關鍵。 –

+0

是的,監聽者正在報告文件大小已被髮送。 另外我想學習UDP,我認爲知道兩者都很有價值。 – user974703

回答

1

您沒有發送給正確的對等人。您從getaddrinfo獲得p,然後發送給它。所以你正在發送消息給你自己。

for(p = servinfo; p != NULL; p = p->ai_next) 
/* .... */ 


numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, 
    (struct sockaddr *)&their_addr, &addr_len)) == -1) 

/* .... */ 
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, 
    p->ai_addr, p->ai_addrlen)) == -1) 

你可能想將其發送到「他們」:

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, 
    (struct sockaddr *)&their_addr, &addr_len)) == -1) 
+0

賓果!這是問題所在。唯一我現在注意到的是,說話者打印出的最後一封信(文件大小)是垃圾。我假設這是因爲我發送的字符串末尾沒有\ n? – user974703

+0

@ user974703你可能想在某處設置'\ 0'。 – cnicutar

0

最簡單的解決方案是讓你的「發送者」監聽它用來發送數據包到服務器的相同端口/ IP。服務器可以從數據包頭中提取源IP /端口,並在那裏發送它的回覆。如果您需要使用不同的端口/ ips進行回覆,那麼您的「發件人」必須將該信息包含在發送的內容中。例如「這是您的信息,請將回復發送到x.x.x.x:yyy」

+0

它不必聽。 'recvfrom'(它已經在做)就足夠了。 – cnicutar