我在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
答案 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。