recvfrom没有从客户端收到任何信息,但客户端正在发送信息

时间:2014-12-22 18:49:05

标签: networking c sockets

所以我想确保我没有错过任何东西,并且我的想法很清楚。

这是我所拥有的代码的一部分:

UDP_Msg mensajeRecibidoUdp;
struct sockaddr_in c_ain;
sock_udp=socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in c_ain;
socklen_t tam_dir;    

while(1)
{
  if(recvfrom(sock_udp, &mensajeRecibidoUdp, sizeof(UDP_Msg), 0,
      (struct sockaddr*) &c_ain, &tam_dir) <0)
 ....

问题在于它等待消息到达。并且消息被发送,但是这段代码没有得到任何东西,它没有解冻。

这是一个简单的练习,客户端已经构建完成。它从一个文件获取端口,然后发送一个UDP_Message,它是一个带有几个整数和一个数组的结构(客户端已经知道IP和端口)。

我认为我处理缓冲区的方式可能是错误的,但我见过的每个例子都是这样的。我还认为可能需要初始化c_ain变量,但如果我理解它就不是这种情况。所以我不明白为什么这个过程被阻止了,不知道什么是正确的单词,并且由于很多时间过去了,警报响起并且过程被杀死(因为它应该有信息并且保持代码,但它没有)。

我可以添加很多其他信息,我试着保持简短。我有点知道,当我运行客户端 - 服务器时,调用是不能正常运行的,因为它的行为是什么。

编辑:绑定:

 bzero((char*)&dir_udp_serv,sizeof(struct sockaddr_in));              
  dir_udp_serv.sin_family=AF_INET;
  dir_udp_serv.sin_addr.s_addr=inet_addr(HOST_SERVIDOR);
  dir_udp_serv.sin_port=0;              
  fprintf(stderr,"SERVIDOR: Asignacion del puerto servidor: ");
  if(bind(sock_udp,
      (struct sockaddr*)&dir_udp_serv,
      sizeof(struct sockaddr_in))<0)
    {
      fprintf(stderr,"ERROR\n");                
      close(sock_udp); exit(1);
    }

第二次编辑:我刚刚意识到代码中有两个绑定。我的想法是在同一台服务器上创建两个连接,一个用于UDP,一个用于TCP。所以我为UDP和TCP做了同样的步骤。从我得到的答案,我意识到可能是错的。即使我创建了两个套接字,一个用于UDp,一个用于TCP,它每个套接字只有1个绑定吗?

以上似乎并非如此。

另外,我不知道应该添加哪些更多细节,但服务器和客户端都在同一台计算机上,因此它们的地址都是127.0.0.1,但这是预期的,我相信不会改变任何原因服务器无法获取客户端发送的信息。

2 个答案:

答案 0 :(得分:2)

问问自己:您的客户在哪个端口发送邮件?服务器代码中的那个端口在哪里? 无处。您忘记将本地套接字绑定到本地地址(和端口):

struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr("0.0.0.0");
local.sin_port = htons(PORT); // Now the server will listen on PORT.

if(bind(sock_udp, (struct sockaddr*)&local, sizeof(local)) < 0){
    perror("bind");
    exit(1);
}

// Now you may call recvfrom on your socket : your server is truly listening.

请注意,您只需要绑定一次。无需将其置于循环中。

答案 1 :(得分:-1)

好吧不确定这是不是这个地方,但我自己的问题的答案是预期的:服务器正在侦听端口,而客户端正在发送到另一个端口。这是因为分配的端口被发送到客户端的方式:在我的情况下,没有将它转换为网络格式(ntohs()),所以当客户端执行htons()时,数字是完全不同的。