Я отправляю файл через TCP, и сервер отправляет сообщение, содержащее «END_OF_MESSAGE», чтобы предупредить клиента о том, что он получил весь файл и может закрыть сокет. Файл отправляется, и клиент получает строку «END_OF_MESSAGE», однако, когда я использую strcmp для сравнения полученной информации с «END_OF_MESSAGE», он никогда не говорит, что они совпадают. Я пробовал strncmp и memcmp, но не понимаю, почему strcmp не говорит мне, что строки совпадают.
Фрагменты кода:
Сервер:
char endMessage[MESSAGESIZE] = "END_OF_MESSAGE";
if ((send(clntSocket, endMessage, sizeof endMessage, 0))!= sizeof endMessage) DieWithError("Sending failed");
Приведенный выше фрагмент кода действительно отправляется.
Клиент:
if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
DieWithError("recv() failed or connection closed prematurely");
totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */
echoBuffer[bytesRcvd] = '\0'; /* Terminate the string! */
if (!(strcmp(echoBuffer, "END_OF_MESSAGE")==0)){
printf(echoBuffer); /* Print the echo buffer */
printf("\n");
}else{
break; //break out of while loop
}
strcmp эхо-буфера и "END_OF_MESSAGE" никогда не возвращает 0, хотя "END_OF_MESSAGE" - это то, что я отправляю с сервера. Я пробовал strncmp сравнивать первые 3 символа ("END") безрезультатно.
Примечание: когда я распечатываю эхо-буфер, самый последний печатает END_OF_MESSAGE, что только добавляет мне путаницы.
Есть ли у кого-нибудь понимание того, что я делаю неправильно?
Спасибо.
MESSAGESIZE > strlen(endMessage)
? (и, скорее всего, полученная вами строка также не завершается нулем) - person wildplasser   schedule 09.04.2017recv()
получает все сообщение"END_OF_MESSAGE\0"
и ТОЛЬКО отдельное сообщение за одно чтение. Это никогда не гарантируется в TCP. Возможно, сообщение получено через несколько вызововrecv()
. Возможно, буфер содержит некоторые данные файла в начале буфера. Вы должны учитывать такие условия. - person Remy Lebeau   schedule 11.04.2017