协议UDP C不支持的地址族错误发送

时间:2018-05-23 00:01:05

标签: c udp ip

我正在尝试通过UDP协议实现通信,我收到错误:“发送错误:协议不支持地址系列”。我已经在谷歌检查了这个问题,但无法找到答案。 请耐心等待,我只是用C编码开始冒险。 这是一个C代码:

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

感谢您的帮助。 ;)

1 个答案:

答案 0 :(得分:2)

您的问题可能是由于未初始化的目标地址。 sendto()将目标地址作为最后一个参数之前的地址。但是你试图提供未初始化的地址(比如recvfrom()

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

还需要提供合适的尺寸。

还有一件事。只要您使用sendto() - 无需执行connect()。 UDP是无连接的,connect()仅为那些将在此类套接字上使用send()的用户建立默认目标地址。但这不是您的情况,因为您每次拨打sendto()时都会提供目的地地址。更多 - 您每次都可以使用不同的地址。

P.S。参考:sendto()