2013-04-06 74 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