客户端服务器已在C中使用UDP实现。客户端发送文件名&服务器在其目录中查找该文件。一旦找到它,服务器就应该发送文件的字节数。 服务器正在发送数据,但客户端没有收到任何数据。
以下是代码:
Server.c:http://pastebin.com/hb8kmaLy
Client.c:http://pastebin.com/ZPdt081u
答案 0 :(得分:0)
查看您的服务器代码,我会改进两件事。
首先,
sendto(sockfd, count, count, 0, (struct sockaddr *)&remaddr, &addrlen);
这似乎不对。第三个参数应该是发送缓冲区的长度。因此,如果count等于20000,则sendto将从计数地址开始发送20000个字节。但count只是一个int,所以它拥有的唯一存储是4个字节(或8个字节)。因此,您至少应该将计数复制到字符串缓冲区,然后将第3个参数作为缓冲区的长度。请注意,如果count为110个字节,则计数缓冲区应指向“110”字符串,然后第三个参数shoudl为strlen(count)或3。在这种情况下。
其次,count变量需要累积。实际上,根据“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);