Я понятия не имею, как работать со строками в C:
вот часть моего сервера:
Перерыв никогда не вызывается, хотя я передаю символ ‘/’ через telnet.
В идеале это будет буферизовать строку, называемую get, добавляя к ней строку ch снова и снова, пока не достигнет определенного символа, или, что еще лучше, строки (но напишите сейчас, она должна работать с символом, но я Я хотел бы знать, как это сделать со строкой, чтобы я мог разработать протокол, который использует CR + LF в качестве разделителя).
char ch;
int index = 0;
char get[1024];
const char str[] = "/";
if ( read( client, &ch, 1 ) < 0 )
{
perror( "read" );
get[index] = ch;
index++;
int compareResult = strncmp(str, &ch, 5);
if(compareResult == 0){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}
}
//if ( write( client, &ch, 1 ) < 0 ) { perror( "write" ); break; }
printf( "got stuff" );
почему он не достигает
printf( "server responded, connection closed" );
линия?
полный код для сервера: http://pastebin.com/j5tX3TEx
Это:
int compareResult = strncmp(str, &ch, 5);
вызывает неопределенное поведение. Вы проходите &ch
адрес одного char
к функции, ожидающей строка указатель. Таким образом, он будет рассматривать не более 5 символов, начиная с адреса &ch
что, конечно, только один характер данных.
Вся ваша логика чтения очень странная, она должна читать больше, а не по одному символу за раз.
Линия
int compareResult = strncmp(str, &ch, 5);
не является правильным
ch — один символ, но вы сравниваете 5 символов. Второй аргумент должен быть строкой, а не символом.
если это опечатка и ты имел ввиду get
тогда вам нужно \ 0 завершить строку после того, как вы получили последний
персонаж для того, чтобы использовать get
в качестве аргумента. альтернативно использовать memcmp
сравнить байты независимо от того,
они строки или нет.
Попробуйте это и посмотрите. Похоже, вы сравниваете массив char (str) с char (ch)
if(ch == '/'){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}
Вы делаете это вместо этого:
if(ch == '/'){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}
Это также быстрее, чем использование функции (например, strncmp
)
read( client, &ch, 1 ) < 0
Зачем < 0
? Кажется, что все сделано в вашем коде, в то время как read возвращает количество прочитанных байтов.