Использование recv для получения входящего массива char - PullRequest
2 голосов
/ 30 декабря 2010

Я вернулся с вопросом о розетках C.

Я пытаюсь получить массив символов от клиента через TCP. У меня есть следующий recv код:

char buffer[2048];
int recvBytes = 0;

while (1) {

    if ((clntSockfd = accept(servSockfd, (struct sockaddr *) &clntAddr, &clntSockAddrLen)) == -1) {
        printf("Unable to accept client connection\n");
    exit(1);
}
    else { 
        printf("Client connection accepted!\n");
    }

    /* clear buffer */
    memset(buffer, 0, sizeof(buffer));

    recvBytes = recv (clntSockfd, buffer, sizeof(buffer), 0);
    printf("Bytes received: %i\n", recvBytes);
    printf("Char array received: %s\n", buffer);
}

Я заметил, что при выполнении recvBytes показывает ноль в первой итерации. Только после второй итерации он получает входящий массив символов.

Я хотел бы узнать, будет ли блокироваться recv, пока я не получу данные из входящего сокета? Как я должен отбросить ненужные символы в буфере - то есть отбросить символы, полученные с первой итерации.

Большое спасибо!

- редактировать ---

Привет всем, я добавил консольный вывод из eclipse.

**... <- initialization stuff
Binding socket to port
Socket binded
Start listening on port 8081.
Client connection accepted!                  *while loop - first iteration
Bytes received: 0                            *while loop - first iteration
Char array received:                         *while loop - first iteration
Client connection accepted!                  *while loop - second iteration
Bytes received: 22                           *while loop - second iteration
Char array received: 1~Message~HowAreYou?    *while loop - second iteration**

Надеюсь, вышеприведенный вывод консоли проиллюстрирует мои вопросы относительно первой и второй итераций Исходя из вышесказанного, первая итерация не получает байтов, но recv не блокирует. Я думал, что recv должен был блокировать, пока не получит байты?

Ответы [ 3 ]

1 голос
/ 30 декабря 2010

Если ваш сокет является блокирующим сокетом, функция recv будет блокироваться, пока вы не получите некоторые данные. Функция recv вернет 0 только тогда, когда другая сторона закроет соединение в большинстве систем.

Я предлагаю вам перепроверить свой код и выполнение и сообщить нам точный результат.

Подробнее см. здесь и здесь .

1 голос
/ 30 декабря 2010

Я полагаю, что recv возвращает 0, только если удаленный конец закрывает соединение (для потоковых сокетов, таких как TCP) или если получен пакет без полезной нагрузки (дейтаграммы, такие как UDP).

Если для сокета был установлен неблокирующий режим (по умолчанию это блокировка), а данных пока нет , вы получите код ошибки, либо EAGAIN, либо EWOULDBLOCK в зависимости от ОС.

В любом случае, каждый раз, когда возвращается recv, новые данные будут сохраняться в начале буфера.Он не будет добавлен к ранее полученным данным, если вы не рассчитаете указатель, предназначенный для хранения новых данных после старых.

0 голосов
/ 30 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...