客户端服务器已在 C 中使用 UDP 实现。客户端发送文件名,服务器在其目录中查找文件。一旦找到它,服务器就应该发送文件的字节数。服务器正在发送数据,但客户端没有收到任何内容。
以下是代码:
服务器.c:http : //pastebin.com/hb8kmaLy
Client.c:http ://pastebin.com/ZPdt081u
客户端服务器已在 C 中使用 UDP 实现。客户端发送文件名,服务器在其目录中查找文件。一旦找到它,服务器就应该发送文件的字节数。服务器正在发送数据,但客户端没有收到任何内容。
以下是代码:
服务器.c:http : //pastebin.com/hb8kmaLy
Client.c:http ://pastebin.com/ZPdt081u
查看您的服务器代码,我会改进两件事。
第一的,
sendto(sockfd, count, count, 0, (struct sockaddr *)&remaddr, &addrlen);
这似乎不对。第三个参数应该是正在发送的缓冲区的长度。因此,如果 count 等于 20000,则 sendto 将从 count 地址开始发送 20000 个字节。但是 count 只是一个 int,所以它唯一的存储空间是 4 个字节(或 8 个字节)。因此,您至少应该将计数复制到字符串缓冲区,然后将第三个参数设为缓冲区的长度。请注意,如果 count 为 110 字节,则 count 缓冲区应指向“110”字符串,在这种情况下,第三个参数应为 strlen(count) 或 3。
其次,计数变量需要是累积的。事实上,根据“while((count=read(fd,buf,BUFSIZE))>0)”,count 变量将可靠地为零或小于零!
我会试试这个。
char str[16];
int count=0, t;
while((t=read(fd,buf,BUFSIZE))>0) {
count += t;
printf("%d",count);
}
sprintf(str, "%d", count);
sendto(sockfd, (void*)str, strlen(str), 0, (struct sockaddr *)&remaddr, addrlen);
客户端代码或多或少还可以。但是,只有当 hte 返回值小于零(或等于 -1)时,我们才应该打印错误。此外,您可能希望传递 sizeof(buf) 而不是 strlen(buf),因为如果 strlen 在缓冲区中找到 NUL 字符,它将停止。
int ret_bytes;
bzero(buf, sizeof(buf));
ret_bytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&remaddr, &addrlen);
printf("Buffer is %s \n", buf);
if (ret_bytes == -1)
printf("recvfrom() failed");
else
printf("Received %s (length: %d)\n", buf, ret_bytes);