c - 协议(protocol)不支持地址族 UDP C 错误发送

标签 c udp ip

我正在尝试通过 UDP 协议(protocol)实现通信,但出现错误:“发送错误:协议(protocol)不支持地址族”。我已经在谷歌上查过这个问题,但找不到答案。 请耐心等待,我只是开始用 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;
} 

感谢您的帮助。 ;)

最佳答案

您的问题可能是由于未初始化的目标地址。 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() 时都提供目标地址。甚至更多 - 您每次都可以使用不同的地址。

附注引用:sendto()

关于c - 协议(protocol)不支持地址族 UDP C 错误发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478030/

相关文章:

http - 如何捕获提供 HTTP 响应的服务器的 IP 地址

使用 if 和 else if 的简单 ATM 机的 c 程序

c - 从二维数组切换到一维(字符串)

python - 在 Python 中进行位域操作的最佳方法是什么?

java - 监控 Windows Server、Java 中的 UDP 数据包丢失

java - 如果使用公共(public) IP,为什么 Rundeck 会重定向到 aws 上的 ec2 私有(private) IP?

c - 使用 pcap 记录 tcp 对话

c - 如何将 CRC 函数从 C 转换为 Ruby?

java - UDP 数据报中发送的消息未经过净化?

scala - 有没有办法获取远程参与者的IP地址?