From 600efc28d57410aa326677e1334336523bef89e2 Mon Sep 17 00:00:00 2001 From: Kolan Sh Date: Mon, 2 May 2011 21:51:34 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=8B...=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B...?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c/masync_server/echo-server.c | 45 +++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/c/masync_server/echo-server.c b/c/masync_server/echo-server.c index 776e49d..4f9f0b6 100644 --- a/c/masync_server/echo-server.c +++ b/c/masync_server/echo-server.c @@ -30,25 +30,28 @@ void *serv_request(void *data) struct connection_cb *connections = NULL; - int listenSocket = *(int *)data; - if (fcntl(listenSocket, F_SETFL, O_NONBLOCK) < 0) + int listenSocket = *(int *)data; // дескриптор сокета передаётся через аргумент pthread + if (fcntl(listenSocket, F_SETFL, O_NONBLOCK) < 0) // делает сокет неблокирующим die("fcntl()", errno); while (1) { - fd_set readFdSet; - fd_set writeFdSet; - struct connection_cb *currentConn, **currentConnPtr, *tempConn; - int maxFdNum; + fd_set readFdSet; // набор дескрипторов сокетов, с кт. в данный момент идёт чтение + fd_set writeFdSet; // набор дескрипторов сокетов, в кт. в данный момент идёт запись + struct connection_cb *currentConn, **currentConnPtr, *tempConn; // выбранное соединение, ???, ??? + int maxFdNum; // ??? - FD_ZERO(&readFdSet); - FD_ZERO(&writeFdSet); + FD_ZERO(&readFdSet); // очистка набора дескрипторов чтения + FD_ZERO(&writeFdSet); // очистка набора дескрипторов записи /* - Добавление дескриптора к множеству readFdSet + * Добавление дескриптора к множеству readFdSet */ - FD_SET(listenSocket, &readFdSet); - maxFdNum = listenSocket; + FD_SET(listenSocket, &readFdSet); // слушающий порт добавляется в список читающих (сюда же входит connect()) + maxFdNum = listenSocket; // ??? не разобрался + /* + * Разделение дескрипторов м/у множествами readFdSet и writeFdSet + */ for (currentConn = connections; currentConn != NULL; currentConn = currentConn->next) { if (currentConn->isReading) FD_SET(currentConn->dataSocket, &readFdSet); @@ -56,8 +59,9 @@ void *serv_request(void *data) FD_SET(currentConn->dataSocket, &writeFdSet); maxFdNum = currentConn->dataSocket > maxFdNum ? currentConn->dataSocket : maxFdNum; } + /* - Получение множества дескрипторов сокетов для обработки + * Получение множества дескрипторов сокетов для обработки (ожидание изменения состояния на сокетах) */ if (select(maxFdNum + 1, &readFdSet, &writeFdSet, NULL, NULL) < 0) { if (errno == EINTR) @@ -70,10 +74,9 @@ void *serv_request(void *data) while (*currentConnPtr != NULL) { /* - Проверка принадлежности дескриптора - (*currentConnPtr)->dataSocket к множеству readFdSet + * Проверка принадлежности дескриптора + * (*currentConnPtr)->dataSocket к множеству readFdSet */ - if ((*currentConnPtr)->isReading && FD_ISSET((*currentConnPtr)->dataSocket, &readFdSet)) { int result = recv((*currentConnPtr)->dataSocket, (*currentConnPtr)->data, sizeof((*currentConnPtr)->data), 0); @@ -100,10 +103,11 @@ void *serv_request(void *data) printf("Recieving as Slave Thread id = '%d' \n", (int)pthread_self()); } } else - /* - Проверка принадлежности дескриптора - (*currentConnPtr)->dataSocket к множеству writedFdSet - */ + + /* + * Проверка принадлежности дескриптора + * (*currentConnPtr)->dataSocket к множеству writedFdSet + */ if (FD_ISSET((*currentConnPtr)->dataSocket, &writeFdSet)) { int result = send((*currentConnPtr)->dataSocket, (*currentConnPtr)->data + (*currentConnPtr)->dataSent, @@ -132,10 +136,9 @@ void *serv_request(void *data) /* Проверка принадлежности дескриптора listenSocket к множеству readFdSet,т.е. необходимости обработать - вызов connect( ) от нового клиента. + вызов connect() от нового клиента. */ if (FD_ISSET(listenSocket, &readFdSet)) { - while (1) { int result = accept(listenSocket, (struct sockaddr *)NULL, NULL);