Как узнать, когда сокет закончил чтение - PullRequest
6 голосов
/ 09 ноября 2010

Я мало знаю о розетках, но пока у меня не было особых проблем. Я на самом деле застрял на том, как узнать, когда другая сторона закончила отправлять сообщения. До сих пор у меня есть цикл while на стороне сервера, который читает данные из сокета, пока ничего не осталось (или это то, что предполагается делать). Это код:

char c[1024]; //buffer
inst much;
while(much = read(sockfd, &c, 1024) > 0) {
   printf("read %d, clientSays> %s\n", much, c);
}
printf("reading, finished\n");

Итак, на стороне клиента я отправляю сообщение "hello world", которое фактически отображается на консоли сервера, но не печатает сообщение "чтение заканчивается", поэтому я предполагаю, что оно застревает в ожидании другого сообщения ,

Я думал, что функция чтения будет возвращать 0, когда нечего было читать, но я думаю, это не так

Итак, что я делаю не так?


Обновление

На самом деле, прочитав ваши ответы и немного пройдя код, я понял, что для этого и нужны протоколы.

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

Спасибо за ваши ответы.

Ответы [ 2 ]

7 голосов
/ 09 ноября 2010

Ваш пример ожидает, что read() вернет 0, что произойдет, когда клиент закроет соединение.Если вы должны держать соединение открытым, но знаете, где находится конец сообщения, вы можете либо поставить перед каждым сообщением его длину, либо добавить маркер конца сообщения в конце.В API сокетов ничего не встроено, чтобы помочь вам.

1 голос
/ 09 ноября 2010

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

Закрывает голову руками

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