Berkeley Socket Send возвращает 0 при успешной неблокирующей отправке

Я пишу неблокирующий чат-сервер, пока сервер работает нормально, но я не могу понять, как исправить частичные отправки, если они произойдут. Отправка (int, char *, int); Функция всегда возвращает 0 в случае успеха и -1 при неудачной отправке. На каждой странице документа / руководства, которую я прочитал, написано, что она должна возвращать количество байтов, фактически переданных в сетевой буфер. Я проверил, чтобы быть уверенным, что я могу отправить на сервер и повторно получить данные повторно без проблем.

Это функция, которую я использую для вызова отправки. Я оба попытался сначала распечатать возвращаемые данные на консоли, а затем попытался разорвать строку в returnValue; во время отладки. Тот же результат, ReturnValue всегда 0 или -1;

int Connection::Transmit(string MessageToSend)
{
// check for send attempts on a closed socket
// return if it happens.
if(this->Socket_Filedescriptor == -1)
return -1;

// Send a message to the client on the other end
// note, the last parameter is a flag bit which
// is used for declaring out of bound data transmissions.
ReturnValue  = send(Socket_Filedescriptor,
MessageToSend.c_str(),
MessageToSend.length(),
0);

return ReturnValue;
}

0

Решение

Почему бы вам не попробовать отправить в цикле? Например:

int Connection::Transmit(string MessageToSend)
{
// check for send attempts on a closed socket
// return if it happens.
if(this->Socket_Filedescriptor == -1)
return -1;

int expected = MessageToSend.length();
int sent     = 0;

// Send a message to the client on the other end
// note, the last parameter is a flag bit which
// is used for declaring out of bound data transmissions.
while(sent < expected) {
ReturnValue  = send(Socket_Filedescriptor,
MessageToSend.c_str() + sent, // Send from correct location
MessageToSend.length() - sent, // Update how much remains
0);
if(ReturnValue == -1)
return -1; // Error occurred
sent += ReturnValue;
}

return sent;
}

Таким образом, ваш код будет постоянно пытаться отправить все данные, пока либо не произойдет ошибка, либо все данные будут отправлены успешно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]