accept语句在两个看起来相似的不同代码中返回两个不同的值?

时间:2014-01-09 14:19:23

标签: c sockets unix

我是C和套接字编程的新手,我正在尝试做一个简单的客户端服务器应用程序。

我发现每当我尝试使用以下代码从服务器连接到客户端时, accept 语句将0返回 connectfd ,当我尝试发送消息时从客户端到达服务器,

if(connectfd = (accept(sockfd , (struct sockaddr *)NULL , NULL)) < 0)
{
    printf("problem while connection to client\n");
    return(0);  
}

但是,当我尝试下面的代码而不是接受语句之上的代码时,将<4>作为值返回 connectfd 并且客户端服务器通信完美发生

connectfd=accept(sockfd,(struct sockaddr *)NULL,NULL);
if(connectfd<0)

{
    printf("server acccept failed...\n");
    exit(0);
}

有人可以对此作出解释吗?

3 个答案:

答案 0 :(得分:4)

这是因为你的括号在错误的地方:

if(connectfd = (accept(sockfd , (struct sockaddr *)NULL , NULL)) < 0)

应该是:

if ((connectfd = accept(sockfd , (struct sockaddr *) NULL, NULL)) < 0)

由于C operator precedence,其中<的优先级高于=,因此connectfd分配的内容是{{的返回值]之间的比较结果1}}和accept,而不是您想要的0的返回值。

答案 1 :(得分:0)

if(connectfd = (accept(sockfd , (struct sockaddr *)NULL , NULL)) < 0)

将“(accept(...)&lt; 0)”分配给“connectfd”

你应该写

if((connectfd = accept(sockfd , (struct sockaddr *)NULL , NULL)) < 0)

答案 2 :(得分:0)

由于优先规则,

if (a = b < c)

被解释为b < ca的分配,而不是a = bc的比较。

这样做的结果是你必须放置括号,Sean already writes in his answer