Я пытаюсь читать символы из сокета; вот функция, которую я создал для этого, во многом вдохновленный Here, где я удаляю некоторые нерелевантные части здесь (этот образец компилируется правильно).Проблема при чтении из сокета
int process(int socketfd, void *buffer, int n)
{
int totread = 0;
char ch;
int numread;
for(;;)
{
numread = read(socketfd, &ch, 1);
if(numread == 0) {
if (totread == 0) {
return 0;
} else {
break;
}
} else {
if(totread < n-1) {
totread++;
printf("totread: %d\n", totread);
printf("Here is OK, ch value gets printed %c\n", ch);
*buffer++ = ch;
printf("With help provided, this line gets printed\n");
printf("But the value <%s> of buffer, is blank (<> output)\n, buffer);
}
if (ch == '\n') {
printf("%c\n", ch);
printf("%s\n", buffer);
break;
}
}
}
return totread;
}
Я не могу понять, почему вторая строка не печатается. Очевидно, что инструкция *buf++ = ch
не работает; Но это выглядит правильно. Это просто влияет на символ, читаемый на следующее значение массива символов buf. Во время компиляции я не вижу ошибок или предупреждений, клиент отключается после того, как первая строка будет напечатана, а вторая не будет достигнута.
EDIT
Вот как я инициализировать мой буфер:
char *buffer = "";
int l = process(newsockfd, buffer, 100);
printf("Number read (function network) %d\n", l);
Это, вероятно, не является подходящим способом сделать это; Я также попытался указать фиксированную длину, такую как char buffer = [255];
. Функция не выходит, но ничего не печатается. Я довольно новичок в программировании на С, большое спасибо за вашу помощь!
Когда вы говорите, что вторая строка не печатается, я полагаю, вы имеете в виду, потому что программа вылетает. Вероятно, это будет segv, вызванный написанием 'buf', когда' buf' является либо 'NULL', либо недопустимой памятью. Что происходит, когда вы запускаете его под 'gdb', скомпилировав с помощью' -g' для включения отладочных символов? – abligh
Буфер достаточно большой? Кроме того, я считаю, что buf [0] никогда не записывается, кажется, что потенциальная проблема может случиться. – cen
Пожалуйста, также покажите нам, как ** вы вызываете эту функцию и, в частности, как передается буфер, и ** инициализируется **. – alk