2013-04-06 100 views
0

我想通過UDP套接字接收文本文件,客戶端生成正常,但給了一個空白的控制檯,經過一些實驗後,我發現問題在於接待,所以我我張貼我的代碼部分:)udp客戶端接收文本文件

size_t data=0; 
if(data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0 
       , (struct sockaddr *) &server, &server_length) < 0) 
{ 
    printf("Error receiving file."); 
    exit(1); 
} 

if(data==sizeof(file_buffer)) 
{ 
    printf("Received Data:[%s]",file_buffer); 
} 

回答

3

你應該重新寫你,如果你忘了加括號(

如果(數據= recvfrom的(SD,file_buffer,的sizeof(file_buffer) 0,(struct sockaddr *)& server,& server_length)< 0)

原因:
<優先級高於=所以你如果()第一<進行再= 和這個事業上的錯誤分配data時數據成功讀取或者01recvfrom()回報-1
看@C Operator Precedence Table

你的代碼是設備上成功讀取:

if(data = 1 < 0) 

recvfrom()失敗了,如:

if(data = -1 < 0) 

錯誤?其實你忘了()括號(或者,如果你不知道你shold補充。),如:

IF((數據= recvfrom的(SD,file_buffer,的sizeof(file_buffer),0,(結構sockaddr *) &服務器,& server_length))< 0)

見我添加()之類:

if((data = recvfrom()) < 0) 
    ^    ^added in your code 

編輯

第二錯誤:「緩衝器不是\0終止」

功能recvfrom()如果成功工作,返回長度,以字節爲單位的消息或數據報。如果收到文件結束條件或連接已關閉,則返回0

要注意的事情是它不會放'\0'符號來終止緩衝區。,並且您正在使用'%s'來打印file_buffer[]的內容,除了空終止的字符串外,這些字符串在運行時也會導致未定義的行爲(並且如果未獲得分段錯誤,您可能會在控制檯上獲得不尋常的符號)。

如果你想使用文件緩衝區作爲字符串,你應該總是閱讀少於之一,並且明確地放置null \0

我可以建議你去做:

no_Of_bytes =recvfrom( 
       sd, 
       file_buffer, 
       sizeof(file_buffer) - 1, 
       0, 
       (struct sockaddr *) &server, 
       &server_length 
      ); 
file_buffer[no_Of_bytes] = '\0'; 

現在你file_buffer是空終止你可以%s使用,但可以肯定你是不是在做其他代碼部分的錯誤。

+0

好吧,現在我正在客戶端接收數據,並且能夠將它寫入文本文件中,但我仍然遇到了一個問題:儘管數據正在寫入,但我在「寫入文件時出錯」控制檯,以及我得到一點冗餘數據! – 2013-04-06 08:08:43

+0

@AaymanKhalid閱讀更新的答案。你的'file_buffer'不是字符串,你使用'%s'來打印它的內容。這是您的代碼中的另一個錯誤。 – 2013-04-06 08:38:51