我有一个UDP客户端和一个UDP服务器。程序的流程是:首先从终端执行服务器,终端创建套接字并绑定它并等待来自客户端的文件名。在另一个终端中执行客户端。这里还创建了一个套接字,并与服务器建立了连接。然后向客户端提供文件名。使用sendto()函数将此文件名发送到服务器。服务器能够从客户端接收文件名,服务器也将文件中的数据发送到客户端。但是,另一方的接收器一直在等待来自服务器的数据。
UDP客户端和服务器的代码如下所示。
UDP服务器:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{
int cont,create_socket,new_socket,addrlen,fd;
int bufsize = 1024;
int nameLen=0;
int client_address_size=0;
char *buffer = malloc(10);
char fname[256];
struct sockaddr_in address,client;
if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0)
printf("The socket was created\n");
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(15000);
if (bind(create_socket,(struct sockaddr *)&address,sizeof(address))== 0)
printf("Binding Socket\n");
nameLen=sizeof(address);
if (getsockname(create_socket,(struct sockaddr *)&address,&nameLen)<0)
{
printf("\n\ngetsockname() error\n");
exit(3);
}
printf("Port assigned is %d\n", ntohs(address.sin_port));
client_address_size=sizeof(client);
if(recvfrom(create_socket,fname, 255,0,(struct sockaddr *) &client,&client_address_size)<0)
{
printf("\n\nrecvfrom() failed\n");
exit(4);
}
printf("A request for filename %s Received..\n", fname);
if ((fd=open(fname, O_RDONLY))<0)
{
perror("File Open Failed");
exit(0);
}
while((cont=read(fd, buffer, 10))>0)
{
//sleep(1);
sendto(create_socket,buffer,cont,0,(struct sockaddr *) &client,&client_address_size);
printf("\n\nPacket sent\n");
}
printf("Request Completed\n");
return close(create_socket);
}
UDP客户端:
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
int create_socket,cont;
char *arg="127.0.0.1";
int bufsize = 1024;
int server_address_size=0;
char *buffer = malloc(10);
char fname[256];
struct sockaddr_in address,server;
if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0)
printf("The Socket was created\n");
address.sin_family = AF_INET;
address.sin_port = htons(15000);
address.sin_addr.s_addr=inet_addr(arg);
if (connect(create_socket,(struct sockaddr *) &address,sizeof(address)) == 0)
printf("The connection was accepted with the server %s...\n",arg);
printf("Enter The Filename to Request : ");
scanf("%s",fname);
sendto(create_socket, fname, sizeof(fname), 0,(struct sockaddr *) &address,sizeof(address));
printf("Request Accepted... Receiving File...\n\n");
server_address_size=sizeof(server);
printf("The contents of file are...\n\n");
while((cont=recvfrom(create_socket, buffer, 10, 0,(struct sockaddr *) &address,sizeof(address)))>0)
{
write(1, buffer, cont);
}
printf("\nEOF\n");
return close(create_socket);
}
我哪里错了?请为此提供适当的解决方案。
提前致谢。
答案 0 :(得分:2)
您使用recvfrom()
中的值结果参数错误。编译器应该非常大声地警告你。 Recvfrom()将尝试在第6个参数中为您返回一个数字,因此您无法将其传递给使用sizeof()
创建的常量。
从联系手册:
参数addrlen是一个 value-result参数,调用者在调用之前应该初始化 与src_addr关联的缓冲区的大小,并在返回时修改以指示 源地址的实际大小。
我改变了这样的recvfrom()循环,并成功发送了一个文件&amp;接收。
int serv_addr_size = sizeof(address);
while((cont=recvfrom(create_socket, buffer, 10, 0,(struct sockaddr *) &address,&serv_addr_size))>0)
{
write(1, buffer, cont);
}
由于您在套接字上调用connect(),您也可以使用recv()
,如下所示:
recv(create_socket, buffer, 10, 0)
作为一些一般性的建议,总是仔细检查系统和库调用的返回值(可能是printf()
除外),并为“返回值”下的函数手册页中列出的所有情况做好准备。
编辑服务器端在另一个方向上产生类似的错误。参数sendto()
应该只是传递的结构的长度,作为指针传递。
sendto(create_socket,buffer,cont,0,(struct sockaddr *) &client,&client_address_size);
应该是
sendto(create_socket,buffer,cont,0,(struct sockaddr *) &client,client_address_size);
答案 1 :(得分:0)
让我写一个有效的例子。我试图重写你自己的代码,但我更喜欢向你展示一个很好的例子。只需几分钟......
--- --- EDIT
好的,我在这里。原谅我花了我的时间,但我更愿意仔细阅读代码。
这是你的两个文件:
真的希望我能帮到你。