Это:
char *retrString = "RETR ";
является строковым литералом , что означает, что память, на которую указывает этот указатель, доступна только для чтения, поэтому ее нельзя изменить / записать.
Ваш раздел "get" нарушает в точности указанное выше, когда пытается изменить строковый литерал:
strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '\0';
Это приводит к ошибке сегментации.
Чтобы обойти эту проблему, просто объявите указатель на символ, затем выделите для него место, заполните его и затем измените его по желанию.
Пример:
char* retrString = NULL;
retString = malloc(sizeof("RETR ") * sizeof(char) + 1); // +1 for the null terminator
strcpy(retrString, "RETR ");
// do your get thing then
strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '\0';