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

标签 c linux sockets udp sendto

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

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

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

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

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

最佳答案

你还没有发布服务器代码,但如果它像这个客户端代码一样,你总是发送 BUFSIZE 个字符,而不考虑字符串长度。

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

关于c - linux sendto() 正在刷新缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53609367/

相关文章:

c - 这个程序中的posix_memalign是什么意思?

c - 分散可变长度数据

android - 为什么构建Android ICS后会生成system.img.ext4?

regex - 在 Linux 中替换无效的 CSV 行尾

php - Laravel Echo 服务器在浏览器中没有响应

linux - 在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

c - Roberts-Slaney-Bouras 整数 FFT 实现问题

c - 将 C 中的文件打印到标准输出的最有效方法是什么?

c - Linux Kernel - 为什么一个函数在 System.map 中的地址比实时看到的地址早一个字节?

具有真实IP地址的python Socket服务器