linux sendto()是刷新缓冲区吗?

时间:2018-12-04 09:16:02

标签: 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);
}

我在一台计算机上运行两个腻子,分别运行客户端和服务器。 上面的代码是客户端源代码的一部分。

分别运行客户端和服务器,客户端首先发送消息,然后当服务器收到消息时,它将新消息发送给客户端。客户端打印从服务器接收到的消息。 (非异步)

客户端将“ abcdefg”发送到服务器,并从服务器接收“ zxc”。然后,当我输出缓冲区时,它仅显示“ zxc”而不是“ zxcdefg”。

我想知道即使我没有调用memset()方法,输出为何也是如此?

1 个答案:

答案 0 :(得分:0)

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

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

相关问题