Mateusz Turek
Mateusz Turek

Reputation: 25

Address family not supported by protocol UDP C Error sending

I'm trying to implement communication by UDP protocol, and I'm getting an error: "Error sending: Address family not supported by protocol". I've checked in Google for this problem but couldn't managed to find answer. Please be patient, I'm only starting my adventure with coding in C. Here is a C code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#define BUFLEN 512

// define function that deals with errors
void error(const char *msg)
{
    perror(msg); // print error msg
    exit(1); // exit the main() function
}

int main(int argc, char *argv[])
{
    struct sockaddr_in serv1_addr, serv2_addr, cli1_addr, cli2_addr; //definicja struktur adresów servera i clienta 
    struct hostent *server; //defines host addres struct
    int cl1_sockfd, se1_sockfd, se2_sockfd, i, c1len = sizeof(cli1_addr), c2len = sizeof(cli2_addr), recv_len, portno1,portno2; // creates inits
    int cli1_len = sizeof(cli1_addr);
    int cli2_len = sizeof(cli2_addr);

    char buf[BUFLEN];

    if (argc < 4) {
        fprintf(stderr,"ERROR, no port provided\n"); // deal with wrong port
        exit(1);
    }

    //tworzenie soceketu servera 
    if ((se1_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        error("socket1");   //if socket() return -1 -- error
    }
    if ((se2_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        error("socket2");   //if socket() return -1 -- error
    }

    //zero out the structure
    memset( &serv1_addr, 0, sizeof(serv1_addr)); //put zero into structure
    memset( &serv2_addr, 0, sizeof(serv2_addr)); //put zero into structure

    portno1 = atoi(argv[2]); // get port number
    portno2 = atoi(argv[3]);


    serv1_addr.sin_family = AF_INET; // specify address family (IPv4)
    serv1_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv1_addr.sin_port = htons(portno1); // set port number

    serv2_addr.sin_family = AF_INET; // specify address family (IPv4)
    serv2_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    serv2_addr.sin_port = htons(portno2); // set port number

    if(connect(se1_sockfd,(struct sockaddr *) &serv1_addr, sizeof(serv1_addr)) < 0)
        error ("ERROR connecting1"); //if connection failed

    if(connect(se2_sockfd,(struct sockaddr *) &serv2_addr, sizeof(serv2_addr)) < 0)
        error ("ERROR connecting2"); //if connection failed
    while(1) //inf loop
    {
        printf("Please enter the message: "); //write the msg to socket
        bzero(buf, 512); //fill buffer with zeros
        fgets(buf, 512, stdin); //read into buffer



        if( sendto( se1_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli1_addr, cli1_len) < 0)
            error ("Error sending1"); 
        if( sendto( se2_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli2_addr, cli2_len) < 0)
            error ("Error sending2"); 


        if (recvfrom(se1_sockfd, buf, BUFLEN, 0, (struct sockaddr *) &cli1_addr, &cli1_len) == -1){
            error("recivfrom()1"); //if reciving failed -- error    
        }
        printf("Data: %s\n", buf);

        if (recvfrom(se2_sockfd, buf, BUFLEN, 0, (struct sockaddr *) &cli2_addr, &cli2_len) == -1){
            error("recivfrom()2"); //if reciving failed -- error    
        }
        printf("Data: %s\n", buf);

    }   

    close(se1_sockfd);
    close(se2_sockfd);
    return 0;
} 

Thanks for your help. ;)

Upvotes: 1

Views: 1627

Answers (1)

Sergio
Sergio

Reputation: 8209

Your issue is likely because of uninitialized destination address. sendto() takes destination address as the one before the last argument. But you are trying to provide not-initialized address (like for recvfrom())

    if( sendto( se1_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli1_addr, cli1_len) < 0)
        error ("Error sending1");
                                                                  ^^^
                                                        Try serv1_addr instead ?

Also need to provide appropriate size.

One more thing. As long as you use sendto() - no need to perform connect(). UDP is connectionless and connect() only establishes default destination address for those who is going to use send() on such socket. But this is not your case because you provide destination address each time you call sendto(). Even more - you may use different addresses each time.

P.S. Reference: sendto()

Upvotes: 2

Related Questions