Я пытаюсь изучить модель клиентского сервера в Linux, и у меня есть два файла C, а именно server.c и client.c. Это фрагменты кода, с которыми у меня возникают проблемы.Как отправить и получить символ новой строки поверх сокетов в модели клиентского сервера?
server.c фрагмент кода
char* message = "<query>\n";
write(client_socket_filedescriptor, message, sizeof(message));
client.c фрагмент кода
char* message = "<query>\n";
read(socket_filedescriptor, buffer, sizeof(buffer));
printf("%s", buffer);
printf("\n\n");
printf("%s", message);
Теперь, когда я бегу мой сервер и затем, когда я бегу мой клиент, я ожидаю, что PRINTF заявления для печати те же строки, что и <query>\n
, но я продолжаю получать разные выходы для buffer
и message
переменных.
Результат выглядит примерно так, когда я запускаю код клиента.
Как вы видите, эти две строки различны. Я пытаюсь смоделировать типичное рукопожатие TCP, и я хочу убедиться, что эти две строки одинаковы, а затем клиент начнет писать или что-то делать с этим сервером. Но у меня есть эта тривиальная проблема. Может ли кто-нибудь сказать мне, как его решить? Я планирую использовать strcmp для сравнения переменных буфера и сообщения, но, поскольку он стоит сейчас, strcmp не возвращает 0, поскольку это разные строки afterall.
'sizeof (message)' -> 'strlen (message) + 1' – kaylum
Значит, вы должны изменить' sizeof (message) 'на' strlen (message) '? Если это так, я получаю сообщение об ошибке, поскольку чтение звонка - только чтение первого символа. – posixKing
Да, вам нужно изменить это - 'sizeof (message)' дает размер указателя, а не то, на что он указывает. Если вы все еще получаете ошибки, то, очевидно, в вашей программе есть другие ошибки. Например, распространенная ошибка предполагает, что 'read' всегда будет получать все сообщение. 'read' должен всегда вызываться в цикле с проверенным возвращаемым значением, чтобы определить, сколько байтов было прочитано. Предоставьте [mcve], если вы хотите получить дополнительную помощь. – kaylum