эхо клиент-сервер в C - у меня есть открытый сервер, который принимает строки от разных клиентов - как заменить старый символ [] в новой итерации - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь сохранить открытый сервер и заставить разных клиентов отправлять серверу строку, сервер сохраняет строку в char rcvdmessage [16] и отправляет ее обратно клиенту. Я новичок в C и не могу понять, почему мой код работает так

если первый клиент отправляет «Hello World», сервер отправляет «Hello World» клиенту. Если второй клиент отправит «Пока», на второй итерации сервер отправит «Мир Байло».

Есть ли способ очистить мое rcvdmessage [16] в начале каждого цикла? Я попытался установить memset [rcvdmessage, 0,16] прямо при инициализации rcvdmessage, но затем сервер отправил пустой массив char клиенту.

while(1){

    // accept - creating a new socket for the accepted connection
    addr_size = sizeof their_addr;
    otherfd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
    // if(otherfd == -1){
    //     fprintf(stderr, "failed to accept, error: %d\n", bind_check);
    //     perror("ERROR on accepting");
    //     return 1;
    // } else fprintf(stderr, "success accept, %d\n", bind_check);

    // receive message
    char rcvdmessage[16];
    int bytes_rcvd = recv(otherfd, rcvdmessage, strlen(rcvdmessage), 0);
    // if(bytes_rcvd == -1){
    //     fprintf(stderr, "failed to receive, error: %d\n", bytes_rcvd);
    //     perror("ERROR on receiving");
    // } else{
    //     printf("Rcvd %s, %d bytes\n", rcvdmessage, bytes_rcvd);
    // }

    // send the received message
    int bytes_sent = send(otherfd, rcvdmessage, strlen(rcvdmessage), 0);
    // if(bytes_sent == -1){
    //     fprintf(stderr, "failed to send, error: %d\n", bytes_sent);
    //     perror("ERROR on sending");
    // } else{
    //     printf("Sent %s, %d bytes\n",rcvdmessage, bytes_sent);
    // }
    // memset(rcvdmessage, 0, strlen(rcvdmessage));
}

1 Ответ

0 голосов
/ 17 января 2019

Функция strlen предназначена для получения длины строки с нулевым символом * .

.массива вам нужно использовать оператор sizeof:

int bytes_rcvd = recv(otherfd, rcvdmessage, sizeof rcvdmessage, 0);
//                                          ^^^^^^

Также обратите внимание, что если данные, отправленные вашим пэром, на самом деле не заканчиваются нулем, то используйте strlen вsend вызов также неверен.Используйте размер полученных данных, заданный функцией recv:

int bytes_sent = send(otherfd, rcvdmessage, bytes_rcvd, 0);
//                                          ^^^^^^^^^^

Тогда для решения вашей проблемы, пока вышеизложенное решит ее, вы должны помнить, что неинициализированные «автоматические» переменные (локальные непеременные) останутся неинициализированными.Их значения или содержимое будут неопределенными и кажутся случайными.

Правильный способ «заменить» локальную переменную внутри цикла - это то, что вы делаете, просто определите его там, где вы уже это делаете.Кажется, что он содержит старые данные из-за неопределенной части и 1027 *, и происходит потому, что компилятор достаточно умен, чтобы использовать одну и ту же память при каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...