2015-05-30 4 views
1

Я новичок в программировании сокетов, и я пытаюсь подключиться к серверу-клиенту с помощью 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; 
} 
+0

В сообщении говорится, все: вы пытаетесь 'connect' уже подключенный сокет (в вашей второй и последующих итераций). В TCP, когда соединение установлено, оно остается открытым до тех пор, пока вы его не отключите вручную. Просто переместите вызов 'connect' из цикла while. – szczurcio

+0

@szczurcio Да, я попробовал, установив соединение перед циклом. В этом случае вот вывод. Аномальное прекращение. Enter Характер Для отправки на сервере или Q/Q, чтобы завершить соединение: A инкрементируется символ из сервера = В Enter Характер Для отправки на сервере или Q/Q, чтобы закончить соединения: Увеличивается символ из сервера = Введите символ для отправки сервера ИЛИ Q/q для завершения соединения: K «Программа завершает работу –

ответ

0

Трудно сказать, где именно вы ошибетесь, не публикуя свои последующие изменения.

Возможно, вы случайно закрываете дескриптор файла из-за размещения ваших скобок (как часть определения блока цикла while)?

Вам нужно будет позвонить только connect() один раз в вашем случае. Следующий код работает отлично для меня (мой код сервера просто записывает символ, полученный клиентом обратно к нему, и клиент получает/печатает его, как ожидалось).

мне пришлось добавить:

address.sin_port = htons(port); 

Затем переместите подключение() вызова функции из цикла, обеспечивая при этом, что близок функции вызов был сделано только тогда, когда вырывается из цикла т.е. получение q или Q.

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 = htons(port); 
    len = sizeof(address); 

    if (connect(sockfd, (struct sockaddr *)&address, len) == -1) { 
      perror("oops: client failed to connect"); 
      return 1; 
     } 

    while(1) 
    { 
     printf("Enter Character To Send The Server OR Q/q To End The Connection:"); 
     scanf("%c", &ch); 
     fflush(stdin); 

     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; 
} 

Если у вас по-прежнему возникают проблемы, возможно, что-то странное происходит внутри вашего кода сервера. Вы случайно отключите клиента?

Некоторые большие, легко понять примеры здесь:

http://www.thegeekstuff.com/2011/12/c-socket-programming

Смежные вопросы