i'm trying to implement a little UDP-Server/Client Application in C and got two errors on Server-side: recvfrom: Bad address && sendto: Address family not supported by protocol. I searched for the mistake and googled for answers but, unfortunately, they wasn't really helpfully... maybe i'm casting a parameter in a wrong way and don't get it. I hope you can give me a hint :).
#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#define BUFFSIZE 256
#define IP "127.0.0.1"
#define PORT 7755
int main(void){
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
char buffer[1] = "s";
struct sockaddr_in src_addr;
struct sockaddr_in dest_addr;
src_addr.sin_family = AF_INET;
src_addr.sin_port = htons(PORT);
src_addr.sin_addr.s_addr = inet_addr(IP);
if(socket_fd==-1)
perror("socket");
if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1)
perror("bind");
if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, (unsigned int *)sizeof(struct sockaddr_in))==-1)
perror("recvfrom");
if(sendto(socket_fd, buffer, 2, 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1)
perror("sendto");
if(close(socket_fd)==-1)
perror("close");
return 0;
}
You need to pass a valid pointer to recvfrom.
(unsigned int *)sizeof(struct sockaddr_in)
is not a valid pointer.Change
to e.g.
You are also constructing an invalid array that you send, Your array has a length of 1, but you tell sendto/recvfrom that it has a length of 2. So change
to
(The string "s" is the character 's' and a 0 byte, so
buffer
will have length 2 in the latter case.)Quoting from Fedora 18 Beta
recv/recvmsg/recv
from main page:recvfrom
should be adjusted from:To:
dest_addr
(eg _buffer_)
is always a pointer type