5

I am always getting no bytes sent, with an errno of 22 (EINVAL, Invalid Argument) with this code. The destination_host is set elsewhere and known to be valid, so I really don't see what is going on. MAXMSGSIZE is 1000. No errors, or warnings. I am compiling with -Wall -Werror -pedantic

char *data_rec;
u_int data_len;

int sockfd;
uint16_t *ns;
struct sockaddr_in address;
struct sockaddr *addr;

char *ip;

int i;
int errno;
int bytes_sent;

data_len = MAXMSGSIZE;
data_rec = malloc(sizeof(char)*MAXMSGSIZE);
ns = malloc(MAXMSGSIZE*sizeof(uint16_t));
ip = malloc(MAXMSGSIZE*sizeof(char));

data_rec = "some random test stuff";

sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd<0) {
    printf("socket() failed\n");
}

inet_ntop(AF_INET,destination_host->h_addr,ip,MAXMSGSIZE);
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(theirPort);
address.sin_addr.s_addr = (unsigned long)ip;

addr = (struct sockaddr*)&address;
bind(sockfd,addr,sizeof(address));
/*Convert the message to uint16_t*/
for(i=0; i<MAXMSGSIZE; i++) {
    ns[i] = htons(data_rec[i]);
}


/* send the message */
bytes_sent = sendto(sockfd, ns, data_len, MSG_DONTWAIT, addr, sizeof(addr));
if(bytes_sent == -1) {
    printf("Error sending: %i\n",errno);
}
Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
dc.
  • 1,429
  • 2
  • 17
  • 29
  • 2
    You could use `perror()` to get a more descriptive error message than `errno 22` – Alex Jasmin Oct 24 '10 at 01:17
  • What happens when s_addr is INADDR_ANY? If that works, you know the problem is... :-) –  Oct 24 '10 at 01:35
  • Also, it seems that you declare `errno` and never assign to it. Maybe you wanted to write `extern int errno`? – vadipp Dec 10 '15 at 09:02

3 Answers3

11

You're giving the wrong size for the address. addr is really a struct sockaddr_in, not a struct sockaddr.

Change the last parameter of sendto to sizeof(address)

nos
  • 223,662
  • 58
  • 417
  • 506
  • Odd how this worked. An example I was following used the size of the sockaddr_in struct and worked fine. – dc. Oct 24 '10 at 19:17
5

inet_ntop probably isn't what you want - it converts from network (i.e. wire) format into presentation format (i.e. "1.2.3.4"). Try:

address.sin_addr.s_addr = *((unsigned long *)destination_host->h_addr);
SimonJ
  • 21,076
  • 1
  • 35
  • 50
  • 1
    In fairness, nos's answer is more likely to fix the error you're seeing, but my answer explains your next problem: why the receiver isn't seeing anything :) – SimonJ Oct 24 '10 at 01:46
-1

You have:

bytes_sent = sendto(sockfd, ns, data_len, MSG_DONTWAIT, addr, sizeof(addr));

Because sizeof(addr) == 4 (or 8), use sizeof(*addr).

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
  • 1
    It needs to be `sizeof(address)`, doesn't it? And that's what the accepted answer says. The trouble with `sizeof(*addr)` is that it is `sizeof(struct sockaddr)`, but the variable is actually a `struct sockaddr_in`. The sockets interface is pretty peculiar, especially the way it handles different types and sizes of addresses. – Jonathan Leffler Dec 13 '16 at 05:45