困在客户端的while循环中

时间:2013-10-23 19:07:20

标签: c unix while-loop

我在C中遇到客户端服务器编程问题。

问题是代码卡在客户端代码中的while循环中。代码是@ Client:

while ((n_read=((read(sockfd,&buffer,sizeof(buffer))))>0)
{   
    buffer[n_read]='\0';                            
    write(fd,buffer,strlen(buffer));
    printf("------- the value of n_read is : %d\n",n_read)  ;
}

因此,当我在客户端使用strace调试此代码时,这是系统调用的快照。我看到从服务器读取整个文件后n_read的值是1,但是在read = 0之后服务器退出正常读取??? 我该如何解决这个问题

客户端代码的快照:

read(3, "._guardAgainstUnicode(pad)\n# Pad"..., 1025) = 1025
write(4, ".", 1)                        = 1
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1
) = 35
read(3, "crypted\nwith the already specifi"..., 1025) = 1025
write(4, "c", 1)                        = 1
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1
) = 35
read(3, " = bytes.fromhex('').join(result"..., 1025) = 1025
write(4, " ", 1)                        = 1
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1
) = 35

1 个答案:

答案 0 :(得分:2)

代码写在缓冲区之外。

如果读取的字节数填充缓冲区,n_read将等于sizeof(buffer)。然后buffer[n_read]='\0'会将过去写为buffer的结尾。

while ((n_read=((read(sockfd,&buffer,sizeof(buffer))))>0) 
{   
    buffer[n_read]='\0';   

而是使用n_read来确定write()长度。

ssize_t n_read;
char buffer[1024];
while ((n_read = read(sockfd, buffer, sizeof buffer)) > 0) {    
  // buffer[n_read]='\0';                            
  // write(fd,buffer,strlen(buffer));
  write(fd, buffer, n_read);
  printf("------- the value of n_read is : %zu\n", (size_t) n_read)  ;
}

[编辑] OP说“同样的问题卡住了”

没有看到服务器代码我提供答案是......

服务器端未发送任何形式的“文件结束”。服务器简单停止发送数据。接收端“不知道”没有更多的数据,它简单地“知道”当时没有更多的数据可用,如此耐心地等待。

(按优先顺序排列)

1)确保服务器确实close(),此使read()最终返回< 0(参见@nos评论)。

2)让服务器在最后一个时发送一个特殊字符。 ASCII码26(^ Z)和255(截断的典型EOF)是典型的候选者。然后当收到的信息收到时,它就会停止。

3)表格数据包。服务器以预设长度发送数据。客户端使用此长度。负值可用于指示错误或EOF。