Изменение
char *message = "\n\nHTTP/1.1 ";
до
char message[1024];
strcpy(message,"\n\nHTTP/1.1 ");
и с вами все будет в порядке, до общей длины сообщения 1023.
Редактировать: (согласно комментарию mjy). Использование strcat таким способом является отличным способом переполнения буфера. Вы можете легко написать небольшую функцию, которая проверяет размер буфера и длину добавления входящей строки, чтобы преодолеть это, или использовать realloc для динамического буфера. IMO, ответственность за правильность размеров буфера там, где они используются, лежит на программисте, например, sprintf s и другие функции C-строк. Я предполагаю, что C используется над C ++ по соображениям производительности, и, следовательно, STL не вариант.
Редактировать: Согласно запросу из комментария Филипа, простая реализация strcat, основанная на буфере символа фиксированного размера:
char buffer[MAXSIZE] = "";
int mystrcat(char *addition)
{
if (strlen(buffer) + strlen(addition) + sizeof(char) >= MaxSize)
return(FAILED);
strcat(buffer,addition);
return(OK);
}
Использование динамического выделения:
char *buffer = NULL;
int mystrcat(char *addition)
{
buffer = realloc(buffer, strlen(buffer) + strlen(addition) + sizeof(char));
if (!buffer)
return(FAIL);
strcat(buffer, addition);
return(OK);
}
В этом случае вы должны освободить буфер вручную, когда закончите с ним. (Обрабатывается деструкторами в эквивалентах C ++)
Приложение (Pax):
Хорошо, поскольку вы на самом деле не объяснили , почему вы должны были создать message[1024]
, вот оно.
При использовании char * x = "hello" фактические байты ('h', 'e', 'l', 'l', 'o', 0) (ноль в конце) сохраняются в области память отделена от переменных (и, возможно, доступна только для чтения), а переменная x указывает на нее. После нуля, вероятно, есть еще кое-что очень важное. Таким образом, вы не можете добавить к этому вообще.
С char x[1024]; strcpy(x,"hello");
вы сначала выделяете 1 Кб памяти, которая полностью выделена для x. Затем вы копируете «hello» в него, и в конце все равно оставляете немного места для добавления дополнительных строк. У вас не будет проблем, пока вы не добавите больше, чем разрешено с лишним 1K.
Конечное приложение (Pax):