限制TCP套接字客户端连接

时间:2015-12-25 07:22:59

标签: c tcp

这个程序是一个tcp服务器,我只想要2个客户端随时连接。 我有一个跟踪客户端连接的计数器count,但如果有2个客户端已经连接,我想用它来阻止任何其他连接。我已多次尝试过,但似乎没有任何效果。 暂时,在count语句中,if位于创建一个处理客户端的线程之前,但如果我连接了第三个客户端,它就不会拒绝连接。 我该怎么做?

 for( ; ; )
  {
    int client;
    thData *td; //parameter executed by thread
    int length = sizeof(from);

    printf("[SERVER] Waiting at port : %d\n", PORT);
    fflush(stdout);
    //accept client
    if((client = accept (sd, (struct sockaddr *) &from, &length)) < 0 )
    {
      perror ("[SERVER]Error at accept\n");
      continue;
    }

    count ++;

    printf("Count : %d\n", count);
    //connection established
    int idThread; //thread id
    int cl;

    td = (struct thData*)malloc(sizeof(struct thData));
    td -> idThread = i++;
    td -> cl = client;

    if (count < 3)
      pthread_create (&th[i], NULL, &treat, td);
    else 
      close((int)td);

    printf("Client descr : %d\n", client);
  } //for

1 个答案:

答案 0 :(得分:0)

1)我认为关闭连接的代码必须是这样的:

if (count < 3)
    pthread_create (&th[i], NULL, &treat, td);
else {
    shutdown( client, SHUT_RDWR );
    close( client );
}

来自here
shutdown - shutdown()调用导致与sockfd关联的套接字上的全部或部分全双工连接被关闭。如果SHUT_RD如何,将不允许进一步接收。如果SHUT_WR如何,则不允许进一步传输。如果SHUT_RDWR如何,将不允许进一步的接收和传输。

2)你可以按照这些方式写一些东西(只是另一种选择,它有点丑陋 - 涉及sleep):

printf("[SERVER] Waiting at port : %d\n", PORT);
fflush(stdout);
int length = sizeof(from);  
for( ; ; ) {
    int client;
    thData *td; //parameter executed by thread
    while ( count < 3 ) {
        if((client = accept (sd, (struct sockaddr *) &from, &length)) < 0 ) {
            perror ("[SERVER]Error at accept\n");
            continue;
        }
        count++;
        printf("Count : %d\n", count);
        //connection established
        int idThread; //thread id
        int cl;
        td = (struct thData*)malloc(sizeof(struct thData));
        td -> idThread = i++;
        td -> cl = client;
        pthread_create (&th[i], NULL, &treat, td);
        printf("Client descr : %d\n", client);
    }
    sleep(??);
}