当没有挂起连接时,accept()返回值

时间:2013-06-15 02:32:47

标签: linux networking

我制作简单的server.c,这样做:

  1. 收听端口7705。
  2. 接受来自“Client-x”的传入连接。
  3. 虽然没有待处理的连接,但是从“Client-1”接收数据。
  4. 如果有来自其他客户端的挂起连接,则转到第二步。
  5. 这是代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main(int argc, char *argv[])
    {
         int sockfd, newsockfd, portno;
         socklen_t clilen;
         char buffer[256];
         struct sockaddr_in serv_addr, cli_addr;
         int n;
         if (argc < 2) {
             fprintf(stderr,"ERROR, no port ..\n");
             exit(1);
         }
         sockfd = socket(AF_INET, SOCK_STREAM, 0);
         if (sockfd < 0) 
            perror("ERROR opening socket");
         bzero((char *) &serv_addr, sizeof(serv_addr));
         portno = atoi(argv[1]);
         serv_addr.sin_family = AF_INET;
         serv_addr.sin_addr.s_addr = INADDR_ANY;
         serv_addr.sin_port = htons(portno);
         if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
             p error("ERROR on binding");
         listen(sockfd,5);
         clilen = sizeof(cli_addr);
        accpt:
         while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) 
        {
        /* i don't know return value for "there is no pending connection" in accept() function, so i use -1 value" */
         bzero(buffer,256);
         n = read(newsockfd,buffer,255);
        ....... // Process data, and etc //
        }
        goto accept
         }
    

3 个答案:

答案 0 :(得分:2)

责备它优先权。 原文:

while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) { ...}

修正版:

while ((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen)) < 0) { ...}
   // ^           ?                                                       ^ ?

如果没有额外的括号,<优先于=,<{1>}优于,并且该语句将被评估为while (newsockfd = (accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) ) { ...},将<比较的结果分配给newsockfd,这显然不是意图。

以上是避免复合作业的一个很好的理由,而是使用这样的成语:

while (1) {
  newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  if (newsockfd >=  0) break;
  ...}
顺便说一下:在OQ中,<的方向也是完全错误的; while {...}中的内容似乎处理传入的连接,这需要一个文件描述符>= 0

答案 1 :(得分:1)

如果没有待处理的关联,accept 将不会返回;它将阻塞,直到有连接,然后它将返回。您可以通过使套接字无阻塞来立即返回,但默认情况下,它们是阻塞的,并且上述行为成立。

答案 2 :(得分:1)

  

我不知道&#34的返回值;没有未决的连接&#34;在accept()函数中

没有。在有接受连接之前它不会返回。它会阻止。