Как сбросить значение строкового указателя C? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь использовать один и тот же указатель дважды, например:

void* pointer = (char*) malloc(15);
pointer = "Patricia";
printf("%s", pointer);
pointer = "John";
printf("%s", pointer);

, но вывод, который я получаю, таков:

Patricia
Johnicia

Вот полный код ( клиентский сценарий является python сценарием, поэтому я не считаю нужным публиковать здесь) (Джон и Патрисия являются примерами имен пользователей, которые может ввести клиент):

#define MAXCLIENTS 256
#define MAXMSG 269

void forward(int clientslist[MAXCLIENTS], char* msg) {
    int x;
    for (x=0; x < MAXCLIENTS;  x++){
        send(clientslist[x], msg, MAXMSG, 0);
    }
    return;
}

int main(){

    #define PORT 5943

    int s = socket(AF_INET, SOCK_STREAM, 0);
    int clients[MAXCLIENTS];
    int clientcounter = 0;

    fd_set socketlist, readlist;
    FD_ZERO(&socketlist);
    FD_SET(s, &socketlist);

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = INADDR_ANY;

    bind(s, (struct sockaddr*) &server, sizeof(server));
    listen(s, MAXCLIENTS);
    int clientsocket;
    int i;
    void* msg = (char *) malloc(MAXMSG);
    void* usr = (char*) malloc(10);


    while (1){
        readlist = socketlist;
        select(FD_SETSIZE, &readlist, NULL, NULL, NULL);
        for (i=0; i<FD_SETSIZE; i++){
            if(FD_ISSET(i, &readlist)){
                if (i == s){
                    clientsocket = accept(s, NULL, NULL);
                    FD_SET(clientsocket, &socketlist);
                    clients[clientcounter] = clientsocket;
                    clientcounter++;
                    recv(clientsocket, usr, 10, 0);
                    printf("Connection received from %s\n", usr);

                } else {
                    recv(i, msg, MAXMSG, 0);
                    forward(clients, msg);
                }
            }

        }
    }
    return 0;
}

Как это исправить ?? Спасибо

1 Ответ

2 голосов
/ 07 апреля 2020

recv возвращает количество прочитанных байтов, и вам просто нужно добавить нулевой терминатор. Например:

ssize_t rc;
rc = recv(clientsocket, usr, 9, 0);
if( rc >= 0 )
    usr[rc] = '\0';

Обратите внимание, что я уменьшил аргумент длины в вызове recv, чтобы обеспечить место для терминатора. Если вы ожидаете получать сообщения длиной 10, вам нужно выделить как минимум 11 байтов для usr. Однако, с такими маленькими буферами, было бы, вероятно, более чисто использовать массив и делать:

char usr[11];
ssize_t rc;
rc = recv(clientsocket, usr, sizeof usr - 1, 0);
if( rc >= 0 )
    usr[rc] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...