LINUX.ORG.RU

Ошибка коннекта


0

0

Имеется мульти-плексированный сервер , который работает на основе select/poll.
Он слушает порт и создает на каждого нового клиента по одному файловому дескриптору .
Если сервер только слушает , то клиенты присоединяются нормально .
Как только сервер начинает писать , присоединение новых клиентов начинает глючить: на каждого нового клиента вместо одного дескриптора создаются три ...

Ответ на: Re: Ошибка коннекта от arsi

Re: Ошибка коннекта

Это код сервера из стивенса :
listenfd = Socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(12345);

Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

Listen(listenfd, LISTENQ);

client[0].fd = listenfd;
client[0].events = POLLRDNORM;
for (i = 1; i < OPEN_MAX; i++)
client[i].fd = -1; /* -1 indicates available entry */
maxi = 0; /* max index





nready = Poll(client, maxi+1, INFTIM);

if (client[0].revents & POLLRDNORM)
{ /* new client connection */
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
printf("new %d client: %s\n", i , Sock_ntop((SA *) &cliaddr, clilen));

for (i = 1; i < OPEN_MAX; i++)
if (client[i].fd < 0) {
client[i].fd = connfd; /* save descriptor */
break;
}
if (i == OPEN_MAX)
err_quit("too many clients");

client[i].events = POLLRDNORM;
if (i > maxi)
maxi = i; /* max index in client[] array */


if (--nready <= 0)
{
continue;
}


}

iivvaann ()
Ответ на: Re: Ошибка коннекта от iivvaann

Re: Ошибка коннекта

ну, здесь всё вроде правильно. непонятно, правда, что это за враперы такие: Socket, Bind, Listen, Poll, Accept. и не понятно, почему не закрыт комментарий в строке «maxi = 0; /* max index» (надеюсь, это только в копипасте, а не в коде).

правильно ли я понял, что фрагмент от «nready = Poll(client, maxi+1, INFTIM);» и до конца крутится в цикле вроде «for (;;) { … }»? после второго фрагмента идёт чтение от клиентов? где и как осуществляется запись клиентам и, самое главное, как происходит закрытие сессии с клиентом?

arsi ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.