-1

客户端服务器已在 C 中使用 UDP 实现。客户端发送文件名,服务器在其目录中查找文件。一旦找到它,服务器就应该发送文件的字节数。服务器正在发送数据,但客户端没有收到任何内容。

以下是代码:

服务器.c:http : //pastebin.com/hb8kmaLy

Client.c:http ://pastebin.com/ZPdt081u

4

1 回答 1

0

查看您的服务器代码,我会改进两件事。

第一的,

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);
于 2013-09-18T01:14:57.653 回答