C winsock функция для отправки всех данных сообщения

Я пишу сервер в c используя WSA, который будет обрабатывать несколько клиентов. Протокол - это то, что я определил самостоятельно, и часть, с которой у меня возникают проблемы, заключается в том, как убедиться, что все сообщение действительно отправляется клиенту.

я send мое сообщение один раз, а потом я проверяю, сколько байтов куда фактически передано. Тогда, если нет, я send снова, и в качестве длины данных, которые я сейчас отправлю, я использую unsentBytes (см. в коде). Моя проблема в том, что когда я пытаюсь отправить лишние байты, которые не были отправлены, я в настоящее время снова отправляю все сообщение. Как я могу отправить только оставшуюся часть сообщения?

Я знаю, что могу отправлять только 1 символ за раз и перестать получать на стороне клиента, когда доберусь до конца сообщения, но я думаю, что я могу сделать это так же, и это лучше.

Это правильная логика для использования?

int send_msg(SOCKET s, char *msg, int msg_len)
{
    int unsentBytes = msg_len;
    int bytesResult = send(s, msg, msg_len, SEND_FLAGS);
    unsentBytes -= bytesResult;
    while (unsentBytes != 0)
    {
        bytesResult = send(s, msg, unsentBytes, SEND_FLAGS); // ### msg is the problem
        unsentBytes -= bytesResult;
    }
}

1 ответ

Решение

Вот рабочий код из одного из моих собственных проектов. Заметка data + count для смещения в данные.

int sendall(int sd, char *data, int length) {
    int count = 0;
    while (count < length) {
        int n = send(sd, data + count, length, 0);
        if (n == -1) {
            return -1;
        }
        count += n;
        length -= n;
    }
    return 0;
}
Другие вопросы по тегам