Я новичок в программировании сокетов, и я пытаюсь подключиться к серверу-клиенту с помощью gcc-компилятора в Linux. Сервер и клиент, оба кода находятся в разных файлах C. Я отправляю символ на сервер через пользовательский ввод, сервер увеличивает его и возвращает его клиенту. Клиент должен оставаться в соединении, пока я не получу символ «Q» из пользователь. У меня возникли проблемы с поддержанием соединения. Здесь я вставляю клиентский код. Он отлично работает, когда я не использую цикл while и отправляет только один символ, но что если я повторно хочу отправить символ по тому же соединению, и соединение будет закрываться только тогда, когда пользователь войдет в Q. Ну, на 1-й итерации цикла. Он запрашивает символ и успешно получает приростный символ от сервера, но второй раз. Он говорит: «Конечная точка транспорта уже подключена». Пожалуйста, помогите мне в понимании этого.Общие сведения о подключении клиент-сервер
int main(int argc, char *argv[])
{
int sockfd;
int len, port;
struct sockaddr_in address;
int result;
char ch;
port = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = port;
len = sizeof(address);
while (1){
printf("Enter Character To Send The Server OR Q/q To End The Connection:");
scanf("%c", &ch);
fflush(stdin);
if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
perror("oops: client failed to connect");
return 1;
}
if (ch == 'Q' || ch == 'q'){
printf("Connection Closed");
break;
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("Incremented character from server = %c\n", ch);
} close(sockfd);
return 0;
}
В сообщении говорится, все: вы пытаетесь 'connect' уже подключенный сокет (в вашей второй и последующих итераций). В TCP, когда соединение установлено, оно остается открытым до тех пор, пока вы его не отключите вручную. Просто переместите вызов 'connect' из цикла while. – szczurcio
@szczurcio Да, я попробовал, установив соединение перед циклом. В этом случае вот вывод. Аномальное прекращение. Enter Характер Для отправки на сервере или Q/Q, чтобы завершить соединение: A инкрементируется символ из сервера = В Enter Характер Для отправки на сервере или Q/Q, чтобы закончить соединения: Увеличивается символ из сервера = Введите символ для отправки сервера ИЛИ Q/q для завершения соединения: K «Программа завершает работу –