#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()方法,输出为何也是如此?
答案 0 :(得分:0)
您尚未发布服务器代码,但是如果像这样的客户端代码,则无论字符串长度如何,您总是发送BUFSIZE
个字符。
如果服务器发送的字符串zxc
是NUL终止的,那么客户端接收到的字符串就是这样。接收的缓冲区中也会有(不可见的)尾随垃圾。