linux sendto() 正在刷新缓冲区?

linux sendto() is flushing buffer?

#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] = '[=11=]';
    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] = '[=11=]';

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

我运行一台电脑上有两个putty,运行分别是客户端和服务器。 以上代码为部分客户端源码

运行分别是客户端和服务端,客户端先发送消息,服务端收到消息后,再发送新的消息给客户端。客户端打印从服务器收到的消息。 (非异步)

客户端向服务器发送"abcdefg",从服务器接收"zxc"。然后,当我输出缓冲区时,它只打印 "zxc" 而不是 "zxcdefg".

我想知道为什么即使我没有调用 memset() 方法,输出也是这样。

您还没有发布服务器代码,但如果像这个客户端代码一样,您总是发送 BUFSIZE 个字符,无论字符串长度如何。

如果服务器发送的字符串 zxc 以 NUL 结尾,那么当它被客户端接收时就是这样。接收缓冲区中也会有(不可见的)尾随垃圾。