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 结尾,那么当它被客户端接收时就是这样。接收缓冲区中也会有(不可见的)尾随垃圾。
#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 结尾,那么当它被客户端接收时就是这样。接收缓冲区中也会有(不可见的)尾随垃圾。