在C中使用UDP的2路客户端服务器

时间:2013-09-18 00:42:59

标签: c udp client

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

以下是代码:

Server.c:http://pastebin.com/hb8kmaLy

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

1 个答案:

答案 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);