这个程序是一个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
答案 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(??);
}