keont
keont

Reputation: 673

recvfrom does not receive anything from the client, but the client is sending the info

So I wanted to make sure I am not missing something and I have the concepts clean in my head.

This is the part of the code I have:

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)
 ....

The problem is that it waits for a message to arrive. And the message is sent, but this code does not get anything, it doesn't unfreeze.

It's a simple exercise, and the client is already built. It gets the port from a file, then sends a UDP_Message that is a struct with a couple ints and an array (the client already knows the IP and port).

I thought the way I handle the buffer could be wrong, but every example I've seen uses it like that. I also thought that the c_ain variable might needed to be initialized, but that's not the case if I understand it properly. So I don't get why the process gets... blocked, not sure what's the proper word, and since a lot of time passes by, an alarm goes off and the process gets killed (because it should have got info and keep with the code but it did not).

I can add lots of other info, I tried to keep it short. I kind of know that call is the one that isn't working properly because of how it behaves when I run the client-server thingy.

Edit: Bind:

 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);
    }

Second edit: I just realized I have two binds in the code. The idea is I create two connections on the same server, one for UDP and one for TCP. So I made the same steps for both UDP and TCP. From the answer I got I realize that might be wrong. Would it be only 1 bind per socket, even if I create two sockets, one for UDp and one for TCP?

The above does not seem to be the case.

Also, I don't know what more details should I add, but the server and client are both on the same computer so their address are both 127.0.0.1, but that's expected and I believe does not change anything as to why the server does not get the info sent from the client.

Upvotes: 2

Views: 9631

Answers (2)

keont
keont

Reputation: 673

Allright not sure if this is the place, but the answer to my own question was one expected: The server was listening in a port, and the client was sending to a different one. That was because of the way the port assigned was sent to the client: in my case, without transform it to network format (ntohs()), so when the client did htons(), the number was a completly different one.

Upvotes: -1

John WH Smith
John WH Smith

Reputation: 2773

Ask yourself: on which port do your clients send their messages? Where is that port in your server code? Nowhere. You forgot to bind your local socket to your local address (and port) :

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.

Note that you only need to bind once. No need to put this in a loop.

Upvotes: 3

Related Questions