Как я могу исправить эту проблему блокировки? - PullRequest
0 голосов
/ 04 августа 2011
119             while(remainLength > 0){
120                if(remainLength >= MAX_LENGTH){
121                   log("WorkHandler::workLoop, remain %d > max %d \n", remainLength, MAX_LENGTH);
122                   currentSentLength = send(client->getFd(), sBuffer, MAX_LENGTH, MSG_NOSIGNAL);
123                   log("currentSentLength %d \n", currentSentLength);
124                }
125                else{
126                   log("WorkHandler::workLoop, remain %d < max %d \n", remainLength, MAX_LENGTH);
127                   currentSentLength = send(client->getFd(), sBuffer, remainLength, MSG_NOSIGNAL);
128                   log("currentSentLength %d \n", currentSentLength);
129                }
130
131
132                if(currentSentLength == -1){
133                   log("WorkHandler::workLoop, connection has been lost \n");
134                   break;
135                }
136                sBuffer += currentSentLength;
137                log("sBuffer %d\n", sBuffer);
138
139                remainLength -= currentSentLength;
140                log("remainLength %d \n", remainLength);
141
142             }

У меня есть этот код, и функция отправки иногда застревает.Некоторые люди отмечают, что используют неблокирующий ввод / вывод.Я использую epoll, поэтому я думаю, что немного сложно изменить весь дизайн на неблокирующий режим.Есть ли способ предотвратить блокировку функции отправки?

Заранее спасибо ..

1 Ответ

3 голосов
/ 04 августа 2011

Если вы не хотите, чтобы send блокировал, вам понадобится неблокирующий ввод / вывод. Обойти это невозможно.

Вам не нужно переводить сокет в неблокирующий режим, хотя флаг MSG_DONTWAIT может использоваться для каждого вызова отдельно. Но вам нужно будет иметь дело с EAGAIN / EWOULDBLOCK кодами ошибок.

со страницы справки, указанной выше:

Аргумент flags представляет собой побитовое ИЛИ нуля или более следующих флагов.

так что вы можете комбинировать это с MSG_NOSIGNAL.

...