你應該重新寫你,如果你忘了加括號(
如果(數據= recvfrom的(SD,file_buffer,的sizeof(file_buffer) 0,(struct sockaddr *)& server,& server_length)< 0)
原因:
的<
優先級高於=
所以你如果()第一<
進行再=
和這個事業上的錯誤分配data
時數據成功讀取或者0
和1
當recvfrom()
回報-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
使用,但可以肯定你是不是在做其他代碼部分的錯誤。
好吧,現在我正在客戶端接收數據,並且能夠將它寫入文本文件中,但我仍然遇到了一個問題:儘管數據正在寫入,但我在「寫入文件時出錯」控制檯,以及我得到一點冗餘數據! – 2013-04-06 08:08:43
@AaymanKhalid閱讀更新的答案。你的'file_buffer'不是字符串,你使用'%s'來打印它的內容。這是您的代碼中的另一個錯誤。 – 2013-04-06 08:38:51