你应该重新写你,如果你忘了加括号(
如果(数据= 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