2014-09-28 3 views
0

Я не понимаю, почему функция read всегда возвращает -1. Я хочу читать из сокета, пока не появится '\ n'!Чтение из сокета TCP C

char* msg = (char*)malloc(sizeof(char)*120); 
    nleft = sizeof(msg); 
    while(nleft>0){ 
     n = read(fdTcp, msg, nleft); 
     if(n == -1){ 
      printf("error reading UPC\n"); 
      exit(1); //error 
     } 
     else if (n == 0){ 
      printf("end of reading EOF\n"); 
      break; //closed by peer 
     } 
     nleft-=n; 
     msg += n; 
    } 
    nread = n-nleft; 
    msg[nread] = '\0'; 
    printf("mensagem do CS: %s\n", msg); 

Заранее благодарен!

+0

Вы можете использовать 'printf ("% s \ n ", strerror (errno))' in 'if (n == - 1) {' branch, чтобы получить дополнительную информацию. – user3125367

+0

sizeof (msg) не равно количеству символов в сообщении. – Deepak

+0

, но я не сейчас, сколько байтов я буду читать, я хочу готово, пока не дойду до '\ n', как я могу это сделать? – user3100832

ответ

2
char* msg = (char*)malloc(sizeof(char)*120); 
nleft = sizeof(msg); 

Поскольку msg является char*, nleft будет число байтов в char*. Я не думаю, что это то, что ты хочешь.

Что касается ответа на ваш реальный вопрос:

, но я сейчас не сколько байтов я буду читать, я хочу готов, пока не достигнет «\ п», как я могу это сделать?

У вас есть два варианта. Страшный вариант - читать по одному байту за раз, пока вы не прочитаете новую строку. Лучший вариант - прочитать как можно больше и проверить новую строку. Если вы прочитаете новую строку, отлично, это будет меньше работы, которую вам нужно будет сделать на следующем проходе. В псевдокоде:

  1. Если нет, по крайней мере один символ новой строки в буфере, перейти к шагу 5.

  2. Извлечение байта до первого символа новой строки из буфера и обрабатывать их.

  3. Переместите все байты, прошедшие после новой строки, в начало буфера и настройте размер буфера, чтобы включить только эти байты.

  4. Перейти к шагу 1.

  5. Выполните блокировку чтения и добавить данные в буфер.

  6. Перейти к шагу 1.

0

Я предполагаю, что ваш сокет успешно открыт сокет-соединение. Тогда файловый дескриптор равен 1, что означает, что готовые данные чтения. Вы попытались прочитать сокет, но вы сделали ошибку с -1. Обычно эта ошибка появляется, когда розетка закрыта. Если вы взяли -1, сокет был закрыт. Если выбрано 0, это означает тайм-аут для чтения данных сокета. С другой стороны, если вы взяли более 0, это значит, прочитайте, сколько байтов.