Я пишу неблокирующий чат-сервер, пока сервер работает нормально, но я не могу понять, как исправить частичные отправки, если они произойдут. Отправка (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;
}
Почему бы вам не попробовать отправить в цикле? Например:
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;
}
Таким образом, ваш код будет постоянно пытаться отправить все данные, пока либо не произойдет ошибка, либо все данные будут отправлены успешно.
Других решений пока нет …