2013-03-14 108 views
0

我有一个UDP客户端和一个UDP服务器。程序的流程是:首先从终端执行服务器,终端创建一个套接字并绑定它并等待客户端的文件名。在另一个终端中执行客户端。这里也创建一个套接字,并与服务器建立连接。然后给客户端提供一个文件名。这个文件名使用sendto()函数发送到服务器。服务器能够从客户端接收文件名,服务器也将文件中的数据发送到客户端。但是另一端的接收机一直在等待来自服务器的数据。UDP客户端无法从服务器接收数据

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

很差代码。与其打印在成功案例中发生的情况而忽略失败案例,您最好建议检查失败案例并打印errno或strerror或调用perror(),以便了解故障。目前什么都可能会出错,你永远不会知道。当你实际做了什么被发送了什么,或者当你所做的所有事情都被创建了无连接套接字时,“接受连接”都被打印出来,就像'请求接受'一样。 – EJP 2013-03-14 07:49:17

+0

也编译所有waring,然后修复代码。 – alk 2013-03-14 07:53:36

回答

2

您正在使用recvfrom()中的值结果参数错误。编译器应该非常大声地警告你。 Recvfrom()将尝试在第6个参数中向您返回一个数字,因此您无法将其传递给使用sizeof()创建的常量。

从手册页:

的参数addrlen中是 值结果参数,其中所述呼叫者应该呼叫到 大小与SRC_ADDR相关联的缓冲器的前初始化,和改性的上返回,以指示 源地址的实际大小。

我改变了这样的recvfrom()循环,并成功发送文件&收到。

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); 
+0

感谢您的答复...我会检查输出并接受你的答案.. – Zax 2013-03-14 09:16:37

+0

你在服务器端做过任何修改吗? Coz即使在客户端发生上述变化之后,我也会得到相同的输出结果。即客户端仍在等待数据被接收。 – Zax 2013-03-14 09:21:28

+0

现在你已经提到它了,我没有去掉sendto()中第6个参数的&&操作符infront。这是编译器警告的自动反射,所以我起初不记得它。就像你的问题上的其他评论所说,代码不是很健壮,你应该仔细检查编译器警告。 – thuovila 2013-03-14 09:27:12

0

让我写一个有效的例子。我试图重写自己的代码,但我更愿意向您展示一个很好的示例。短短几分钟...

---编辑---

好吧,我在这里。原谅我花了我的时间,但我更愿意仔细阅读代码。

这里您的两个文件:

Server implementation

Client implementation

真希望我帮你。

+0

好的...我会很高兴有一些工作的例子。提前致谢。 – Zax 2013-03-14 09:15:12

+0

感谢您的支持...... +1为您的努力... – Zax 2013-03-14 11:03:54

+1

让我知道如果你发现它有用! – none 2013-03-14 11:50:10

相关问题