0

我做了简单的 server.c 来做这个:

  1. 监听 7705 端口。
  2. 接受来自“Client-x”的传入连接。
  3. 当没有挂起的连接时,从“Client-1”接收数据。
  4. 如果有来自另一个客户端的挂起连接,则转到第二步。

这是代码

#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
     }
4

3 回答 3

2

归咎于优先权。原来的:

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

固定版本:

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

如果没有额外的括号,<则优先于 (绑定比 更紧密=,并且该语句将被评估为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;
  ...}

BTW:在OQ中,方向<也是完全错误的;里面的东西while {...}似乎处理传入的连接,这需要一个 filedescriptor >= 0

于 2013-06-15T11:23:52.947 回答
1

我不知道 accept() 函数中“没有挂起的连接”的返回值

没有一个。在有连接接受之前它不会返回。它阻塞。

于 2013-06-15T10:19:25.603 回答
1

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

于 2013-06-15T03:18:20.987 回答