linux sendto () очищает буфер? - PullRequest
       56

linux sendto () очищает буфер?

0 голосов
/ 04 декабря 2018
#define BUFSIZE 256
int sockfd;
char buf[BUFSIZE];
struct sockaddr_in server_addr, client_addr;

sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(4100);

while(1){
    printf("to server: ");
    fgets(buf, sizeof(buf), stdin);
    buf[strlen(buf)-1] = '\0';
    sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&server_addr, sizeof(server_addr);
    //memset(buf, 0, BUFSIZE);
    recvfrom(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&client_addr, sizeof(client_addr);
    printf("from: %s\n", buf);
}



//SERVER code
#define BUFSIZE 256
int sockfd;
char buf[BUFSIZE];
struct sockaddr_in server_addr, client_addr;

sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(4100);

bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

while(1){
    recvfrom(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&client_addr, sizeof(client_addr);
    printf("from client: %s\n", buf);

    printf("to client: ");
    fgets(buf, sizeof(buf), stdin);
    buf[strlen(buf)-1] = '\0';

    sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&client_addr, sizeof(client_addr);
}

Я запускаю две замазки на одном компьютере и запускаю клиент и сервер соответственно.Приведенный выше код является частью исходного кода клиента.

Запустите клиенты и серверы соответственно, клиент сначала отправляет сообщение, а когда сервер получает сообщение, он отправляет новое сообщение клиенту.Клиент печатает сообщение, полученное с сервера.(не асинхронный)

Клиент отправляет «abcdefg» на сервер и получает «zxc» от сервера.Затем, когда я вывожу буфер, он печатает только «zxc» вместо «zxcdefg».

Мне интересно, почему вывод выглядит так, хотя я не вызывал метод memset ().

1 Ответ

0 голосов
/ 04 декабря 2018

Вы не опубликовали код сервера, но если он похож на этот код клиента, вы всегда отправляете BUFSIZE символов, независимо от длины строки.

Если строка zxc отправленасервер NUL завершен, то вот как он будет выглядеть при получении клиентом.В полученном буфере также будет (невидимый) конечный мусор.

...