#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/