-2

我在客户端服务器模型中有这些循环,但是客户端代码中的这些循环是从文件中读取,直到文件为 0 或 EOF,但即使条件为真,它也永远不会进入循环???

int n_read;

while ( (   n_read=((read(sockfd,&buffer,sizeof(buffer))))>0    )   );
{
    printf("test to print\n");
    write(fd,buffer,strlen(buffer));
    //bzero(&buffer,sizeof(buffer));


}

奇怪的是我在服务器代码中有相同的循环来读取和写入文件,它的工作很完美,但我不知道为什么在客户端不能作为服务器工作???

这是服务器循环代码:

while (( read(fd,buffer,sizeof(buffer)))>0) /* to read from open file descriptor */
                         {
                            n=write(connfd,&buffer,n);
                             if(n<0){error("Error,Reading from socket \n");}     
                            {buffer[n] = '\0';}
                         }

那么,如何解决这个问题?

4

2 回答 2

2

您在客户端代码的行尾有一个分号。

while ( (   n_read=((read(sockfd,&buffer,sizeof(buffer))))>0    )   );
                                                                     ^

这是考虑整个循环。在它为假之前,您不会执行以下代码,然后在失败之前只执行一次。

你也对括号有点疯狂。你可以把它减少到

while ((n_read = read(sockfd, &buffer, sizeof(buffer))) > 0)
于 2013-10-22T23:10:55.213 回答
0

忠告:千万不要放“;” (分号)经过一段时间/ for 循环依偎在右括号上。你真的想要一种编码风格,要么将分号放在自己的行上,要么在每个循环之后更好地放置 {}(大括号)。

有些人喜欢拥抱其他方法来避免这个问题。

我更喜欢循环关键字下的 {} 和行尾的 clean ) 。

请在两个程序中显示您对缓冲区的声明。在一个中您提供 &buffer (缓冲区的地址),而在另一个中您仅提供缓冲区。可能您的缓冲区已被声明为指针或数组,因此“&”会导致问题。

因为套接字很乐意携带二进制文件,您可能希望确保终止您收到的任何 cstring,例如,

int n_read;
while ( (n_read=read(sockfd,&buffer,sizeof(buffer))) >0 )
{
    buffer[n_read]='\0';
    printf("test to print, %s\n",buffer);
    write(fd,buffer,strlen(buffer));
}
于 2013-10-23T01:35:02.167 回答