【问题标题】:weird while loop in c sockets?c套接字中的奇怪while循环?
【发布时间】:2013-11-01 00:49:45
【问题描述】:

我在客户端服务器模型中有这些循环,但是客户端代码中的这些循环是从文件中读取,直到文件为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));


}

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

这是服务器循环代码:

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';}
                         }

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

【问题讨论】:

    标签: c linux unix while-loop conditional-statements


    【解决方案1】:

    建议:千万不要放“;” (分号)经过一段时间/ for 循环依偎在右括号上。您确实需要一种编码风格,将分号放在单独的行上,或者在每个循环之后更好地放置 {}(大括号)。

    有些人喜欢使用 cuddled-else 方法来避免这个问题。

    我更喜欢循环关键字下的 {} 和行尾的 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));
    }
    

    【讨论】:

      【解决方案2】:

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

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

      这是考虑整个循环。你不会执行下面的代码,直到它是假的,然后在失败之前只执行一次。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多