комменты... комменты... комменты...
This commit is contained in:
parent
e0b307f190
commit
600efc28d5
@ -30,25 +30,28 @@ void *serv_request(void *data)
|
|||||||
|
|
||||||
struct connection_cb *connections = NULL;
|
struct connection_cb *connections = NULL;
|
||||||
|
|
||||||
int listenSocket = *(int *)data;
|
int listenSocket = *(int *)data; // дескриптор сокета передаётся через аргумент pthread
|
||||||
if (fcntl(listenSocket, F_SETFL, O_NONBLOCK) < 0)
|
if (fcntl(listenSocket, F_SETFL, O_NONBLOCK) < 0) // делает сокет неблокирующим
|
||||||
die("fcntl()", errno);
|
die("fcntl()", errno);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
fd_set readFdSet;
|
fd_set readFdSet; // набор дескрипторов сокетов, с кт. в данный момент идёт чтение
|
||||||
fd_set writeFdSet;
|
fd_set writeFdSet; // набор дескрипторов сокетов, в кт. в данный момент идёт запись
|
||||||
struct connection_cb *currentConn, **currentConnPtr, *tempConn;
|
struct connection_cb *currentConn, **currentConnPtr, *tempConn; // выбранное соединение, ???, ???
|
||||||
int maxFdNum;
|
int maxFdNum; // ???
|
||||||
|
|
||||||
FD_ZERO(&readFdSet);
|
FD_ZERO(&readFdSet); // очистка набора дескрипторов чтения
|
||||||
FD_ZERO(&writeFdSet);
|
FD_ZERO(&writeFdSet); // очистка набора дескрипторов записи
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Добавление дескриптора к множеству readFdSet
|
* Добавление дескриптора к множеству readFdSet
|
||||||
*/
|
*/
|
||||||
FD_SET(listenSocket, &readFdSet);
|
FD_SET(listenSocket, &readFdSet); // слушающий порт добавляется в список читающих (сюда же входит connect())
|
||||||
maxFdNum = listenSocket;
|
maxFdNum = listenSocket; // ??? не разобрался
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Разделение дескрипторов м/у множествами readFdSet и writeFdSet
|
||||||
|
*/
|
||||||
for (currentConn = connections; currentConn != NULL; currentConn = currentConn->next) {
|
for (currentConn = connections; currentConn != NULL; currentConn = currentConn->next) {
|
||||||
if (currentConn->isReading)
|
if (currentConn->isReading)
|
||||||
FD_SET(currentConn->dataSocket, &readFdSet);
|
FD_SET(currentConn->dataSocket, &readFdSet);
|
||||||
@ -56,8 +59,9 @@ void *serv_request(void *data)
|
|||||||
FD_SET(currentConn->dataSocket, &writeFdSet);
|
FD_SET(currentConn->dataSocket, &writeFdSet);
|
||||||
maxFdNum = currentConn->dataSocket > maxFdNum ? currentConn->dataSocket : maxFdNum;
|
maxFdNum = currentConn->dataSocket > maxFdNum ? currentConn->dataSocket : maxFdNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Получение множества дескрипторов сокетов для обработки
|
* Получение множества дескрипторов сокетов для обработки (ожидание изменения состояния на сокетах)
|
||||||
*/
|
*/
|
||||||
if (select(maxFdNum + 1, &readFdSet, &writeFdSet, NULL, NULL) < 0) {
|
if (select(maxFdNum + 1, &readFdSet, &writeFdSet, NULL, NULL) < 0) {
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
@ -70,10 +74,9 @@ void *serv_request(void *data)
|
|||||||
while (*currentConnPtr != NULL) {
|
while (*currentConnPtr != NULL) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Проверка принадлежности дескриптора
|
* Проверка принадлежности дескриптора
|
||||||
(*currentConnPtr)->dataSocket к множеству readFdSet
|
* (*currentConnPtr)->dataSocket к множеству readFdSet
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((*currentConnPtr)->isReading && FD_ISSET((*currentConnPtr)->dataSocket, &readFdSet)) {
|
if ((*currentConnPtr)->isReading && FD_ISSET((*currentConnPtr)->dataSocket, &readFdSet)) {
|
||||||
int result = recv((*currentConnPtr)->dataSocket, (*currentConnPtr)->data,
|
int result = recv((*currentConnPtr)->dataSocket, (*currentConnPtr)->data,
|
||||||
sizeof((*currentConnPtr)->data), 0);
|
sizeof((*currentConnPtr)->data), 0);
|
||||||
@ -100,10 +103,11 @@ void *serv_request(void *data)
|
|||||||
printf("Recieving as Slave Thread id = '%d' \n", (int)pthread_self());
|
printf("Recieving as Slave Thread id = '%d' \n", (int)pthread_self());
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
/*
|
|
||||||
Проверка принадлежности дескриптора
|
/*
|
||||||
(*currentConnPtr)->dataSocket к множеству writedFdSet
|
* Проверка принадлежности дескриптора
|
||||||
*/
|
* (*currentConnPtr)->dataSocket к множеству writedFdSet
|
||||||
|
*/
|
||||||
if (FD_ISSET((*currentConnPtr)->dataSocket, &writeFdSet)) {
|
if (FD_ISSET((*currentConnPtr)->dataSocket, &writeFdSet)) {
|
||||||
int result = send((*currentConnPtr)->dataSocket,
|
int result = send((*currentConnPtr)->dataSocket,
|
||||||
(*currentConnPtr)->data + (*currentConnPtr)->dataSent,
|
(*currentConnPtr)->data + (*currentConnPtr)->dataSent,
|
||||||
@ -132,10 +136,9 @@ void *serv_request(void *data)
|
|||||||
/*
|
/*
|
||||||
Проверка принадлежности дескриптора listenSocket
|
Проверка принадлежности дескриптора listenSocket
|
||||||
к множеству readFdSet,т.е. необходимости обработать
|
к множеству readFdSet,т.е. необходимости обработать
|
||||||
вызов connect( ) от нового клиента.
|
вызов connect() от нового клиента.
|
||||||
*/
|
*/
|
||||||
if (FD_ISSET(listenSocket, &readFdSet)) {
|
if (FD_ISSET(listenSocket, &readFdSet)) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int result = accept(listenSocket, (struct sockaddr *)NULL, NULL);
|
int result = accept(listenSocket, (struct sockaddr *)NULL, NULL);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user